925 lines
25 KiB
JSON
925 lines
25 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://shd.build/schemas/game-data-capture/evidence-archive-manifest-v1.json",
|
|
"title": "Game data capture evidence archive manifest v1",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"schema_version",
|
|
"archive_id",
|
|
"created_at",
|
|
"generator",
|
|
"artifacts",
|
|
"captures",
|
|
"screens",
|
|
"jobs",
|
|
"extractions",
|
|
"groups",
|
|
"reviews",
|
|
"exports",
|
|
"errors",
|
|
"evidence_values",
|
|
"observed_instances",
|
|
"canonical_candidates"
|
|
],
|
|
"properties": {
|
|
"schema_version": { "const": 1 },
|
|
"archive_id": { "$ref": "#/$defs/id" },
|
|
"created_at": { "$ref": "#/$defs/timestamp" },
|
|
"generator": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["name", "version", "policy_version"],
|
|
"properties": {
|
|
"name": { "type": "string", "minLength": 1, "maxLength": 100 },
|
|
"version": { "type": "string", "minLength": 1, "maxLength": 50 },
|
|
"policy_version": { "type": "string", "minLength": 1, "maxLength": 50 }
|
|
}
|
|
},
|
|
"artifacts": {
|
|
"type": "array",
|
|
"maxItems": 10000,
|
|
"items": { "$ref": "#/$defs/artifact" }
|
|
},
|
|
"captures": {
|
|
"type": "array",
|
|
"maxItems": 10000,
|
|
"items": { "$ref": "#/$defs/capture" }
|
|
},
|
|
"screens": {
|
|
"type": "array",
|
|
"maxItems": 10000,
|
|
"items": { "$ref": "#/$defs/screen" }
|
|
},
|
|
"jobs": {
|
|
"type": "array",
|
|
"maxItems": 20000,
|
|
"items": { "$ref": "#/$defs/job" }
|
|
},
|
|
"extractions": {
|
|
"type": "array",
|
|
"maxItems": 20000,
|
|
"items": { "$ref": "#/$defs/extraction" }
|
|
},
|
|
"groups": {
|
|
"type": "array",
|
|
"maxItems": 10000,
|
|
"items": { "$ref": "#/$defs/group" }
|
|
},
|
|
"reviews": {
|
|
"type": "array",
|
|
"maxItems": 10000,
|
|
"items": { "$ref": "#/$defs/review" }
|
|
},
|
|
"exports": {
|
|
"type": "array",
|
|
"maxItems": 1000,
|
|
"items": { "$ref": "#/$defs/export" }
|
|
},
|
|
"errors": {
|
|
"type": "array",
|
|
"maxItems": 20000,
|
|
"items": { "$ref": "#/$defs/error" }
|
|
},
|
|
"evidence_values": {
|
|
"type": "array",
|
|
"maxItems": 100000,
|
|
"items": { "$ref": "#/$defs/evidenceValue" }
|
|
},
|
|
"observed_instances": {
|
|
"type": "array",
|
|
"maxItems": 20000,
|
|
"items": { "$ref": "#/$defs/observedInstance" }
|
|
},
|
|
"canonical_candidates": {
|
|
"type": "array",
|
|
"maxItems": 20000,
|
|
"items": { "$ref": "#/$defs/canonicalCandidate" }
|
|
}
|
|
},
|
|
"$defs": {
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
|
|
},
|
|
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
"timestamp": { "type": "string", "format": "date-time", "maxLength": 40 },
|
|
"family": {
|
|
"enum": [
|
|
"weapon",
|
|
"gear",
|
|
"skill_chip",
|
|
"os_protocol",
|
|
"specialization",
|
|
"weapon_mod",
|
|
"gear_mod",
|
|
"unknown"
|
|
]
|
|
},
|
|
"recordType": {
|
|
"enum": [
|
|
"weapon",
|
|
"weapon_talent",
|
|
"weapon_augmentation_profile",
|
|
"gear",
|
|
"brand_set",
|
|
"gear_talent",
|
|
"gear_augmentation_profile",
|
|
"skill_chip_set",
|
|
"skill_chip_set_bonus",
|
|
"skill_chip_roll_pool",
|
|
"skill_chip_talent",
|
|
"os_protocol",
|
|
"os_protocol_secondary_profile",
|
|
"os_protocol_talent",
|
|
"specialization",
|
|
"specialization_focus",
|
|
"specialization_ability",
|
|
"specialization_tree_node",
|
|
"specialization_tree_rank",
|
|
"weapon_mod",
|
|
"gear_mod"
|
|
]
|
|
},
|
|
"missingReason": {
|
|
"enum": [
|
|
"not_visible",
|
|
"occluded",
|
|
"unreadable",
|
|
"not_present_on_screen",
|
|
"unsupported",
|
|
"ambiguous",
|
|
"extraction_failed",
|
|
"not_applicable",
|
|
"redacted"
|
|
]
|
|
},
|
|
"jsonValue": {
|
|
"oneOf": [
|
|
{ "type": "null" },
|
|
{ "type": "boolean" },
|
|
{ "type": "number" },
|
|
{ "type": "string", "maxLength": 8192 },
|
|
{
|
|
"type": "array",
|
|
"maxItems": 500,
|
|
"items": { "$ref": "#/$defs/jsonValue" }
|
|
},
|
|
{
|
|
"type": "object",
|
|
"maxProperties": 500,
|
|
"additionalProperties": { "$ref": "#/$defs/jsonValue" }
|
|
}
|
|
]
|
|
},
|
|
"sourceEngine": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["kind", "engine_id", "engine_version"],
|
|
"properties": {
|
|
"kind": {
|
|
"enum": [
|
|
"local_ocr",
|
|
"openai_vision",
|
|
"classifier",
|
|
"manual",
|
|
"video_decoder"
|
|
]
|
|
},
|
|
"engine_id": { "type": "string", "minLength": 1, "maxLength": 100 },
|
|
"engine_version": { "type": "string", "minLength": 1, "maxLength": 100 }
|
|
}
|
|
},
|
|
"region": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["coordinate_space", "x", "y", "width", "height"],
|
|
"properties": {
|
|
"coordinate_space": { "const": "normalized" },
|
|
"x": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
"y": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
"width": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 },
|
|
"height": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 }
|
|
}
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["coordinate_space", "x", "y", "width", "height"],
|
|
"properties": {
|
|
"coordinate_space": { "const": "pixels" },
|
|
"x": { "type": "integer", "minimum": 0, "maximum": 100000 },
|
|
"y": { "type": "integer", "minimum": 0, "maximum": 100000 },
|
|
"width": { "type": "integer", "minimum": 1, "maximum": 100000 },
|
|
"height": { "type": "integer", "minimum": 1, "maximum": 100000 }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"valueState": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["raw_text", "normalized_value", "missing_reason"],
|
|
"properties": {
|
|
"raw_text": { "type": ["string", "null"], "maxLength": 8192 },
|
|
"normalized_value": { "$ref": "#/$defs/jsonValue" },
|
|
"missing_reason": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/missingReason" }]
|
|
}
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"normalized_value": { "type": "null" },
|
|
"missing_reason": { "$ref": "#/$defs/missingReason" }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"normalized_value": { "not": { "type": "null" } },
|
|
"missing_reason": { "type": "null" }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"correction": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"correction_id",
|
|
"corrected_at",
|
|
"actor",
|
|
"reason",
|
|
"before",
|
|
"after"
|
|
],
|
|
"properties": {
|
|
"correction_id": { "$ref": "#/$defs/id" },
|
|
"corrected_at": { "$ref": "#/$defs/timestamp" },
|
|
"actor": { "enum": ["local_user", "system_reprocess"] },
|
|
"reason": { "type": "string", "minLength": 1, "maxLength": 1000 },
|
|
"before": { "$ref": "#/$defs/valueState" },
|
|
"after": { "$ref": "#/$defs/valueState" }
|
|
}
|
|
},
|
|
"evidenceValue": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"evidence_id",
|
|
"field_path",
|
|
"raw_text",
|
|
"normalized_value",
|
|
"missing_reason",
|
|
"confidence",
|
|
"source_engine",
|
|
"image_artifact_id",
|
|
"image_sha256",
|
|
"region",
|
|
"correction_history"
|
|
],
|
|
"properties": {
|
|
"evidence_id": { "$ref": "#/$defs/id" },
|
|
"field_path": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z0-9_.-]{1,256}$"
|
|
},
|
|
"raw_text": { "type": ["string", "null"], "maxLength": 8192 },
|
|
"normalized_value": { "$ref": "#/$defs/jsonValue" },
|
|
"missing_reason": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/missingReason" }]
|
|
},
|
|
"confidence": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
"source_engine": { "$ref": "#/$defs/sourceEngine" },
|
|
"image_artifact_id": { "$ref": "#/$defs/id" },
|
|
"image_sha256": { "$ref": "#/$defs/sha256" },
|
|
"region": { "$ref": "#/$defs/region" },
|
|
"correction_history": {
|
|
"type": "array",
|
|
"maxItems": 100,
|
|
"items": { "$ref": "#/$defs/correction" }
|
|
}
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"normalized_value": { "type": "null" },
|
|
"missing_reason": { "$ref": "#/$defs/missingReason" }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"normalized_value": { "not": { "type": "null" } },
|
|
"missing_reason": { "type": "null" }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"fieldClaim": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"path",
|
|
"value",
|
|
"missing_reason",
|
|
"evidence_refs",
|
|
"uncertainty_note"
|
|
],
|
|
"properties": {
|
|
"path": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,256}$" },
|
|
"value": { "$ref": "#/$defs/jsonValue" },
|
|
"missing_reason": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/missingReason" }]
|
|
},
|
|
"evidence_refs": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 100,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"uncertainty_note": { "type": ["string", "null"], "maxLength": 2000 }
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"value": { "type": "null" },
|
|
"missing_reason": { "$ref": "#/$defs/missingReason" }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"value": { "not": { "type": "null" } },
|
|
"missing_reason": { "type": "null" }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"classification": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"family",
|
|
"view",
|
|
"gear_slot",
|
|
"record_types",
|
|
"confidence",
|
|
"abstention_reason"
|
|
],
|
|
"properties": {
|
|
"family": { "$ref": "#/$defs/family" },
|
|
"view": { "type": "string" },
|
|
"gear_slot": { "type": ["string", "null"] },
|
|
"record_types": {
|
|
"type": "array",
|
|
"uniqueItems": true,
|
|
"maxItems": 8,
|
|
"items": { "$ref": "#/$defs/recordType" }
|
|
},
|
|
"confidence": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
"abstention_reason": { "type": ["string", "null"] }
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"family": { "const": "weapon" },
|
|
"view": {
|
|
"enum": [
|
|
"detail",
|
|
"blueprint",
|
|
"crafting",
|
|
"stat_range",
|
|
"talent_grid",
|
|
"augmentation"
|
|
]
|
|
},
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"items": {
|
|
"enum": [
|
|
"weapon",
|
|
"weapon_talent",
|
|
"weapon_augmentation_profile"
|
|
]
|
|
}
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "gear" },
|
|
"view": {
|
|
"enum": ["detail", "blueprint", "talent", "augmentation"]
|
|
},
|
|
"gear_slot": {
|
|
"enum": [
|
|
"Mask",
|
|
"Gloves",
|
|
"Backpack",
|
|
"Body Armor",
|
|
"Holster",
|
|
"Knee Pads"
|
|
]
|
|
},
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"items": {
|
|
"enum": [
|
|
"gear",
|
|
"brand_set",
|
|
"gear_talent",
|
|
"gear_augmentation_profile"
|
|
]
|
|
}
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "skill_chip" },
|
|
"view": { "enum": ["detail", "set_bonus", "talent"] },
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"items": {
|
|
"enum": [
|
|
"skill_chip_set",
|
|
"skill_chip_set_bonus",
|
|
"skill_chip_roll_pool",
|
|
"skill_chip_talent"
|
|
]
|
|
}
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "os_protocol" },
|
|
"view": { "enum": ["detail", "secondary_profile", "talent"] },
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"items": {
|
|
"enum": [
|
|
"os_protocol",
|
|
"os_protocol_secondary_profile",
|
|
"os_protocol_talent"
|
|
]
|
|
}
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "specialization" },
|
|
"view": {
|
|
"enum": [
|
|
"overview",
|
|
"details",
|
|
"ability",
|
|
"focus_details",
|
|
"focus_tree",
|
|
"rank_details"
|
|
]
|
|
},
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"items": {
|
|
"enum": [
|
|
"specialization",
|
|
"specialization_focus",
|
|
"specialization_ability",
|
|
"specialization_tree_node",
|
|
"specialization_tree_rank"
|
|
]
|
|
}
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "weapon_mod" },
|
|
"view": { "const": "detail" },
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"maxItems": 1,
|
|
"items": { "const": "weapon_mod" }
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "gear_mod" },
|
|
"view": { "const": "detail" },
|
|
"gear_slot": { "const": null },
|
|
"record_types": {
|
|
"minItems": 1,
|
|
"maxItems": 1,
|
|
"items": { "const": "gear_mod" }
|
|
},
|
|
"abstention_reason": { "const": null }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"family": { "const": "unknown" },
|
|
"view": { "const": "unknown" },
|
|
"gear_slot": { "const": null },
|
|
"record_types": { "maxItems": 0 },
|
|
"abstention_reason": {
|
|
"enum": [
|
|
"low_confidence",
|
|
"ambiguous_family",
|
|
"ambiguous_view",
|
|
"unsupported_family",
|
|
"unsupported_view",
|
|
"insufficient_visual_evidence",
|
|
"occluded",
|
|
"corrupt_image",
|
|
"resource_limit",
|
|
"cancelled"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"artifact": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"artifact_id",
|
|
"sha256",
|
|
"media_type",
|
|
"byte_size",
|
|
"sensitivity",
|
|
"parent_artifact_id",
|
|
"video_timestamp_ms"
|
|
],
|
|
"properties": {
|
|
"artifact_id": { "$ref": "#/$defs/id" },
|
|
"sha256": { "$ref": "#/$defs/sha256" },
|
|
"media_type": {
|
|
"enum": [
|
|
"image/png",
|
|
"image/webp",
|
|
"image/avif",
|
|
"video/mp4",
|
|
"video/webm",
|
|
"video/x-matroska"
|
|
]
|
|
},
|
|
"byte_size": { "type": "integer", "minimum": 1 },
|
|
"sensitivity": { "const": "private" },
|
|
"parent_artifact_id": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/id" }]
|
|
},
|
|
"video_timestamp_ms": {
|
|
"type": ["integer", "null"],
|
|
"minimum": 0,
|
|
"maximum": 86400000
|
|
}
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"properties": {
|
|
"media_type": { "enum": ["image/png", "image/webp", "image/avif"] },
|
|
"byte_size": { "maximum": 67108864 }
|
|
}
|
|
},
|
|
{
|
|
"properties": {
|
|
"media_type": {
|
|
"enum": ["video/mp4", "video/webm", "video/x-matroska"]
|
|
},
|
|
"byte_size": { "maximum": 17179869184 }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"capture": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"capture_id",
|
|
"artifact_id",
|
|
"state",
|
|
"received_at",
|
|
"failure_reason"
|
|
],
|
|
"properties": {
|
|
"capture_id": { "$ref": "#/$defs/id" },
|
|
"artifact_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"received",
|
|
"spooling",
|
|
"stored",
|
|
"deduplicated",
|
|
"queued",
|
|
"failed",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"received_at": { "$ref": "#/$defs/timestamp" },
|
|
"failure_reason": { "type": ["string", "null"], "maxLength": 2000 }
|
|
}
|
|
},
|
|
"screen": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"screen_id",
|
|
"artifact_id",
|
|
"classified_at",
|
|
"classification"
|
|
],
|
|
"properties": {
|
|
"screen_id": { "$ref": "#/$defs/id" },
|
|
"artifact_id": { "$ref": "#/$defs/id" },
|
|
"classified_at": { "$ref": "#/$defs/timestamp" },
|
|
"classification": { "$ref": "#/$defs/classification" }
|
|
}
|
|
},
|
|
"job": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"job_id",
|
|
"kind",
|
|
"state",
|
|
"attempt",
|
|
"max_attempts",
|
|
"last_error_id"
|
|
],
|
|
"properties": {
|
|
"job_id": { "$ref": "#/$defs/id" },
|
|
"kind": {
|
|
"enum": [
|
|
"classify",
|
|
"ocr",
|
|
"vision_fallback",
|
|
"frame_extract",
|
|
"export"
|
|
]
|
|
},
|
|
"state": {
|
|
"enum": [
|
|
"queued",
|
|
"running",
|
|
"retry_wait",
|
|
"succeeded",
|
|
"failed",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"attempt": { "type": "integer", "minimum": 0, "maximum": 20 },
|
|
"max_attempts": { "type": "integer", "minimum": 1, "maximum": 20 },
|
|
"last_error_id": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/id" }]
|
|
}
|
|
}
|
|
},
|
|
"extraction": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"extraction_id",
|
|
"screen_id",
|
|
"state",
|
|
"evidence_refs",
|
|
"abstention_reason"
|
|
],
|
|
"properties": {
|
|
"extraction_id": { "$ref": "#/$defs/id" },
|
|
"screen_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"pending",
|
|
"local_processing",
|
|
"fallback_pending",
|
|
"fallback_processing",
|
|
"candidate_ready",
|
|
"abstained",
|
|
"failed",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"evidence_refs": {
|
|
"type": "array",
|
|
"maxItems": 1000,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"abstention_reason": { "type": ["string", "null"], "maxLength": 100 }
|
|
}
|
|
},
|
|
"group": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["group_id", "state", "screen_ids", "supersedes_group_ids"],
|
|
"properties": {
|
|
"group_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"ungrouped",
|
|
"proposed",
|
|
"grouped",
|
|
"split",
|
|
"superseded",
|
|
"rejected",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"screen_ids": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 100,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"supersedes_group_ids": {
|
|
"type": "array",
|
|
"maxItems": 100,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
}
|
|
}
|
|
},
|
|
"review": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["review_id", "candidate_id", "state", "updated_at", "note"],
|
|
"properties": {
|
|
"review_id": { "$ref": "#/$defs/id" },
|
|
"candidate_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"pending",
|
|
"in_review",
|
|
"changes_requested",
|
|
"approved",
|
|
"rejected",
|
|
"cancelled"
|
|
]
|
|
},
|
|
"updated_at": { "$ref": "#/$defs/timestamp" },
|
|
"note": { "type": ["string", "null"], "maxLength": 4000 }
|
|
}
|
|
},
|
|
"export": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["export_id", "state", "artifact_id", "failure_reason"],
|
|
"properties": {
|
|
"export_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"not_requested",
|
|
"queued",
|
|
"building",
|
|
"ready",
|
|
"failed",
|
|
"cancelled",
|
|
"expired"
|
|
]
|
|
},
|
|
"artifact_id": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/id" }]
|
|
},
|
|
"failure_reason": { "type": ["string", "null"], "maxLength": 2000 }
|
|
}
|
|
},
|
|
"error": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["error_id", "state", "code", "message", "retry_after"],
|
|
"properties": {
|
|
"error_id": { "$ref": "#/$defs/id" },
|
|
"state": {
|
|
"enum": [
|
|
"open",
|
|
"retryable",
|
|
"retrying",
|
|
"recovered",
|
|
"terminal",
|
|
"dismissed"
|
|
]
|
|
},
|
|
"code": {
|
|
"enum": [
|
|
"cancelled",
|
|
"resource_limit",
|
|
"timeout",
|
|
"invalid_input",
|
|
"engine_failure",
|
|
"storage_failure",
|
|
"network_failure",
|
|
"schema_rejected",
|
|
"unsupported",
|
|
"ambiguous"
|
|
]
|
|
},
|
|
"message": { "type": "string", "minLength": 1, "maxLength": 2000 },
|
|
"retry_after": {
|
|
"oneOf": [{ "type": "null" }, { "$ref": "#/$defs/timestamp" }]
|
|
}
|
|
}
|
|
},
|
|
"observedContext": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["level", "quality", "tier", "upgrade_state"],
|
|
"properties": {
|
|
"level": { "$ref": "#/$defs/fieldClaim" },
|
|
"quality": { "$ref": "#/$defs/fieldClaim" },
|
|
"tier": { "$ref": "#/$defs/fieldClaim" },
|
|
"upgrade_state": { "$ref": "#/$defs/fieldClaim" }
|
|
}
|
|
},
|
|
"observedInstance": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"instance_id",
|
|
"family",
|
|
"source_screen_ids",
|
|
"observed_context",
|
|
"fields"
|
|
],
|
|
"properties": {
|
|
"instance_id": { "$ref": "#/$defs/id" },
|
|
"family": { "$ref": "#/$defs/family" },
|
|
"source_screen_ids": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 100,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"observed_context": { "$ref": "#/$defs/observedContext" },
|
|
"fields": {
|
|
"type": "array",
|
|
"maxItems": 1000,
|
|
"items": { "$ref": "#/$defs/fieldClaim" }
|
|
}
|
|
}
|
|
},
|
|
"canonicalCandidate": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"candidate_id",
|
|
"record_type",
|
|
"source_instance_ids",
|
|
"evidence_refs",
|
|
"fields",
|
|
"completeness",
|
|
"relationship_status",
|
|
"mechanic_status"
|
|
],
|
|
"properties": {
|
|
"candidate_id": { "$ref": "#/$defs/id" },
|
|
"record_type": { "$ref": "#/$defs/recordType" },
|
|
"source_instance_ids": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 100,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"evidence_refs": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 1000,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/id" }
|
|
},
|
|
"fields": {
|
|
"type": "array",
|
|
"maxItems": 1000,
|
|
"items": { "$ref": "#/$defs/fieldClaim" }
|
|
},
|
|
"completeness": { "enum": ["complete", "incomplete", "unsupported"] },
|
|
"relationship_status": {
|
|
"enum": ["evidenced", "unresolved", "unsupported", "not_applicable"]
|
|
},
|
|
"mechanic_status": {
|
|
"enum": ["evidenced", "unresolved", "unsupported", "not_applicable"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|