The curator Python backend (package, tests, systemd units, config templates, scripts) now lives under scenarios/curator/backend and is the single source of truth; the live checkout at the workspace path is a runtime copy. Exported from the app repo's tracked tree via git archive (no history, .pi/venv/caches excluded). 149 unit tests pass from the new location. profile.toml backend is now repo-relative (scenarios/curator/backend); verify-generated.sh resolves a relative backend against REPO_ROOT. verify-no-secrets ASSIGN heuristic now requires value entropy so vendored kwargs like token=extraction_token no longer false-positive. README documents the backend/ layout and the operator-owned app rollout step.
141 lines
3.3 KiB
JSON
141 lines
3.3 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://curator.local/schemas/extraction.json",
|
|
"title": "extraction",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"items"
|
|
],
|
|
"properties": {
|
|
"source_title": {
|
|
"type": "string",
|
|
"maxLength": 500
|
|
},
|
|
"source_summary": {
|
|
"type": "string",
|
|
"maxLength": 600
|
|
},
|
|
"no_items_reason": {
|
|
"type": "string",
|
|
"maxLength": 600
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"maxItems": 8,
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"media_type",
|
|
"title"
|
|
],
|
|
"properties": {
|
|
"media_type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"book",
|
|
"movie",
|
|
"tv",
|
|
"music"
|
|
]
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"maxLength": 300
|
|
},
|
|
"original_title": {
|
|
"type": "string",
|
|
"maxLength": 300
|
|
},
|
|
"aliases": {
|
|
"type": "array",
|
|
"maxItems": 8,
|
|
"items": {
|
|
"type": "string",
|
|
"maxLength": 200
|
|
}
|
|
},
|
|
"creator": {
|
|
"type": "string",
|
|
"maxLength": 200
|
|
},
|
|
"year": {
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
],
|
|
"minimum": 1000,
|
|
"maximum": 2999,
|
|
"description": "Four-digit year, or null when not known. Never a guess."
|
|
},
|
|
"external_ids": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"imdb": {
|
|
"type": "string",
|
|
"maxLength": 64
|
|
},
|
|
"tmdb": {
|
|
"type": "string",
|
|
"maxLength": 64
|
|
},
|
|
"tvdb": {
|
|
"type": "string",
|
|
"maxLength": 64
|
|
},
|
|
"isbn": {
|
|
"type": "string",
|
|
"maxLength": 64
|
|
}
|
|
},
|
|
"description": "Only identifiers explicitly present in the input. Never inferred."
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"primary",
|
|
"secondary"
|
|
]
|
|
},
|
|
"evidence": {
|
|
"type": "string",
|
|
"maxLength": 400,
|
|
"description": "How the source substantively discusses the work."
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"maxLength": 600
|
|
},
|
|
"recommendation": {
|
|
"type": "string",
|
|
"enum": [
|
|
"strong",
|
|
"worth",
|
|
"optional",
|
|
"skip"
|
|
]
|
|
},
|
|
"reasons": {
|
|
"type": "array",
|
|
"maxItems": 3,
|
|
"items": {
|
|
"type": "string",
|
|
"maxLength": 300
|
|
}
|
|
},
|
|
"suggested_action": {
|
|
"type": "string",
|
|
"enum": [
|
|
"collect",
|
|
"wanted",
|
|
"ignore"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|