{"apiVersion": "openeyes.nails.web.v1", "boundary": "local_crawl_job_manifest_normalization_only_no_live_collection", "collectionExecutionEnabled": false, "collectorAuthorization": {"adapterJobAuthorizationFields": ["adapterId", "adapterVersion", "providerId", "market", "platform", "collectionMethod"], "adapterRegistryPath": "/api/web/v1/plugins/nails/crawl-adapters", "capabilityKind": "nails.provider_crawl_adapter_plugin", "policyId": "nails-crawl-adapters-v1", "requiredCollectorRuntime": "external_read_only_collector", "requiredRightsBoundary": {"collectionExecutionByNailsWeb": false, "liveCollectionAlreadyCompleted": true, "networkByNailsWeb": false}}, "contract": {"additionalProperties": false, "contractVersion": 1, "inputModes": ["inline_json", "uri"], "manifestShape": {"adapterJobRequiredFields": ["adapterId", "adapterVersion", "providerId", "market", "platform", "observedAt", "windowStart", "windowEnd", "collectionMethod", "records"], "contractVersion": 1, "kind": "nails.provider_crawl_job_manifest", "recordRequiredFields": ["externalId", "observedAt", "metrics", "taxonomy", "source", "rightsPolicy", "licenseRef", "contentHash", "perceptualHash", "riskLabels", "confidence"], "requiredFields": ["contractVersion", "kind", "jobId", "collectorPlugin", "rightsBoundary", "adapterJobs"]}, "name": "nails-crawl-jobs-normalize-request", "optionalFields": ["crawlJobManifest", "crawlJobManifestUri", "objectUriMirrorRoot", "envMode", "now"], "requiredFields": ["outputDir", "stateRoot", "objectRoot"], "responseFields": ["normalizedRecordsBatch", "collectorAuthorization", "authorizedAdapterCapabilities", "recordsBatchPath", "recordsBatchDigest", "nextCrawlRecordsBatchIngestRequest", "objectUriReads"], "schemaDigest": "724799dc5ca284893c84a052ecf3971e6de85205d6504b5b30b6d7d22077f0ea", "schemaId": "https://openeyes.local/plugins/nails/web/v1/crawl-jobs-normalize-request.schema.json"}, "deployEnabled": false, "liveCollectionEnabled": false, "manifestShape": {"adapterJobRequiredFields": ["adapterId", "adapterVersion", "providerId", "market", "platform", "observedAt", "windowStart", "windowEnd", "collectionMethod", "records"], "contractVersion": 1, "kind": "nails.provider_crawl_job_manifest", "recordRequiredFields": ["externalId", "observedAt", "metrics", "taxonomy", "source", "rightsPolicy", "licenseRef", "contentHash", "perceptualHash", "riskLabels", "confidence"], "requiredFields": ["contractVersion", "kind", "jobId", "collectorPlugin", "rightsBoundary", "adapterJobs"]}, "method": "GET", "network": false, "normalizeContractPath": "/api/web/v1/plugins/nails/crawl-jobs:normalize-contract", "normalizePath": "/api/web/v1/plugins/nails/crawl-jobs:normalize", "normalizesTo": {"cloudRunSafeHandoff": true, "kind": "nails.normalized_crawl_records_batch", "materializedRecordsBatchPathMode": "local_debug_artifact", "nextRoute": "/api/web/v1/plugins/nails/crawl-records-batch:ingest", "nextRouteInputMode": "inline_json"}, "objectUriReader": {"acceptedSchemes": ["gs", "oss"], "bucketAllowlistEnv": ["MALIANG_NAILS_RESOURCE_BUCKETS", "NAILS_AUDIT_EVIDENCE_BUCKET", "NAILS_SOURCE_ASSETS_BUCKET", "NAILS_DESIGN_PACKAGES_BUCKET", "NAILS_PUBLIC_ASSETS_BUCKET"], "defaultMode": "local_object_uri_mirror", "gcsModeEnv": "NAILS_WEB_GCS_URI_READ_ENABLED=1", "secretMaterialReturned": false}, "ok": true, "pluginId": "nails", "productionMutations": false, "recordsBatchIngestContractPath": "/api/web/v1/plugins/nails/crawl-records-batch:ingest-contract", "recordsBatchIngestPath": "/api/web/v1/plugins/nails/crawl-records-batch:ingest", "route": "/api/web/v1/plugins/nails/crawl-jobs:normalize-contract", "schema": {"$id": "https://openeyes.local/plugins/nails/web/v1/crawl-jobs-normalize-request.schema.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "oneOf": [{"not": {"required": ["crawlJobManifestUri"]}, "required": ["crawlJobManifest"]}, {"not": {"required": ["crawlJobManifest"]}, "required": ["crawlJobManifestUri"]}], "properties": {"crawlJobManifest": {"description": "Inline provider crawl job manifest emitted by an approved external collector plugin after it has already performed read-only collection and normalization.", "type": "object"}, "crawlJobManifestUri": {"description": "Stable non-secret gs:// or oss:// object URI containing a provider crawl job manifest.", "minLength": 1, "pattern": "^(gs|oss)://[^?#]+$", "type": "string"}, "envMode": {"default": "process", "enum": ["process", "fixture"], "type": "string"}, "now": {"description": "Optional RFC3339 timestamp forwarded into the generated ingest request.", "type": "string"}, "objectRoot": {"description": "Local object root to carry forward into the generated crawl-records-batch:ingest request.", "minLength": 1, "type": "string"}, "objectUriMirrorRoot": {"description": "Optional local mirror root for stable object URI reads.", "minLength": 1, "type": "string"}, "outputDir": {"description": "Local output directory for the materialized records batch.", "minLength": 1, "type": "string"}, "stateRoot": {"description": "Local state root to carry forward into the generated crawl-records-batch:ingest request.", "minLength": 1, "type": "string"}}, "required": ["outputDir", "stateRoot", "objectRoot"], "title": "Nails Crawl Jobs Normalize Request v1", "type": "object"}, "secretMaterialReturned": false, "submitEnabled": false, "uploadEnabled": false}