{"acceptanceCriteria": [{"endpointEvidence": "requires_regression", "id": "default_product_line", "story": "Platform starts from empty state with Nails as the default product line."}, {"endpointEvidence": "design_package_summary", "id": "fixture_signal_coverage", "story": "CN and GLOBAL fixture inputs produce explainable normalized NailTrendSignals."}, {"endpointEvidence": "design_package_summary", "id": "nail_design_set_pack_variants", "story": "One complete ten-nail NailDesignSet includes valid 24 and 30 piece variants."}, {"endpointEvidence": "design_package_summary", "id": "gates_visual_canonical_assets", "story": "Release gates pass and three generated images reference one canonical set."}, {"endpointEvidence": "requires_regression", "id": "publishable_private_candidate", "story": "Private candidate publication is available without leaking private sources."}, {"endpointEvidence": "maliang_dry_run_status", "id": "maliang_dry_run_payload", "story": "A parent set manifest and asset-linked Maliang dry-run payload exist."}, {"endpointEvidence": "local_dry_run_receipt", "id": "mocked_import_status_receipt", "story": "Mocked import, status, receipt, failure, and idempotency replay are covered."}, {"endpointEvidence": "requires_regression", "id": "crochet_legacy_readonly", "story": "Crochet legacy catalog and lineage remain read-only with mutations denied."}, {"endpointEvidence": "endpoint_policy", "id": "no_external_side_effects", "story": "Default checks do not use network, buckets, external DBs, Secret Manager, deploy, or Maliang online submit."}, {"endpointEvidence": "requires_git_and_environment_audit", "id": "branch_environment_isolation", "story": "Main, other branches, other projects, and online environments remain unchanged."}], "apiVersion": "openeyes.nails.web.v1", "checks": ["verified_design_package", "maliang_dry_run_status", "local_dry_run_receipt", "no_network", "no_submit"], "contract": {"additionalProperties": false, "contractVersion": 1, "name": "nails-offline-contract-mvp-readiness-request", "optionalFields": [], "requiredFields": ["stateRoot"], "schemaDigest": "3bc2451dadcd382161fdf42b0d25ae93fcd04771bf418ad889d24f93a150d749", "schemaId": "https://openeyes.local/plugins/nails/web/v1/offline-contract-mvp-readiness-request.schema.json"}, "linksContract": {"crawlExportsDryRun": "/api/web/v1/plugins/nails/crawl-exports:dry-run", "designPackagesQuery": "/api/web/v1/plugins/nails/design-packages:query", "maliangHandoffPackage": "/api/web/v1/plugins/nails/maliang-exports:handoff-package", "maliangReadiness": "/api/web/v1/plugins/nails/maliang-exports:readiness", "publicReleaseReadiness": "/api/web/v1/plugins/nails/public-release:readiness-report"}, "method": "GET", "network": false, "ok": true, "pluginId": "nails", "readinessPath": "/api/web/v1/plugins/nails/offline-contract-mvp:readiness", "responseLinksContract": {"apiInputPackageRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:api-input-package", "requiresStateRoot": true, "submitEnabled": false, "uploadEnabled": false}, "apiInputWorkflowRequest": {"contractPath": "/api/web/v1/plugins/nails/maliang-exports:api-input-workflow-contract", "digestField": "apiInputWorkflowDigest", "expectedDigest": "c0f3235f74a31c0080d4b3a547099c4653c903cdc98340afe266aac0bc3345ee", "method": "GET", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:api-input-workflow", "requiresStateRoot": false, "responseFields": ["apiInputWorkflow", "apiInputWorkflowDigest", "standardEndpointOrder"]}, "apiInputWorkflowVerificationBinding": {"actualDigest": "80d6bdda37ea74f1a3092d369a125b76a4e764df02f5e2459e510190b9eeab31", "actualDigestField": "apiInputWorkflowVerifyRequest.verificationDigest", "expectedDigest": "80d6bdda37ea74f1a3092d369a125b76a4e764df02f5e2459e510190b9eeab31", "expectedDigestSource": "maliang-exports:api-input-workflow-verify.verificationDigest", "network": false, "status": "local_workflow_verification_bound", "verificationEvidenceField": "apiInputWorkflowVerifyRequest.verificationEvidence", "verified": true}, "apiInputWorkflowVerificationDigest": "80d6bdda37ea74f1a3092d369a125b76a4e764df02f5e2459e510190b9eeab31", "apiInputWorkflowVerifyRequest": {"body": {"expectedDigest": "c0f3235f74a31c0080d4b3a547099c4653c903cdc98340afe266aac0bc3345ee"}, "bodyFields": ["expectedDigest"], "contractPath": "/api/web/v1/plugins/nails/maliang-exports:api-input-workflow-verify-contract", "digestField": "apiInputWorkflowDigest", "expectedDigest": "c0f3235f74a31c0080d4b3a547099c4653c903cdc98340afe266aac0bc3345ee", "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:api-input-workflow-verify", "verifiedField": "verified"}, "authorizedSubmitPreviewRequest": {"approvalLedgerFallback": {"contractPath": "/api/web/v1/plugins/nails/online-pilot:approval-ledger-contract", "digestFields": ["authorizationRequirementsDigest", "approvalEvidencePolicyDigest", "nextGateRequestsDigest", "authorizationRequestBundleVerificationDigest"], "mode": "used_when_approvalEvidence_is_omitted", "network": false, "path": "/api/web/v1/plugins/nails/online-pilot:approval-ledger", "requiresStateRoot": true, "sourceField": "currentApprovalEvidence"}, "bodyFields": ["stateRoot", "payloadDigest", "approvalEvidence", "authorizationRequirementsDigest", "approvalEvidencePolicyDigest", "nextGateRequestsDigest", "authorizationRequestBundleVerificationDigest"], "bodyTemplate": {"approvalEvidence": "<online-pilot:evidence-packet.approvalEvidenceTemplate>", "approvalEvidencePolicyDigest": "<online-pilot:evidence-packet.approvalEvidencePolicyDigest>", "authorizationRequestBundleVerificationDigest": "<online-pilot:authorization-request-bundle-verify.verificationDigest>", "authorizationRequirementsDigest": "<online-pilot:evidence-packet.authorizationRequirementsDigest>", "nextGateRequestsDigest": "<online-pilot:evidence-packet.nextGateRequestsDigest>", "payloadDigest": "<payloadDigest>", "stateRoot": "<stateRoot>"}, "contractPath": "/api/web/v1/plugins/nails/online-pilot:authorized-submit-preview-contract", "deployEnabled": false, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/online-pilot:authorized-submit-preview", "requiresStateRoot": true, "sourceFields": {"approvalEvidence": "online-pilot:evidence-packet.approvalEvidenceTemplate", "approvalEvidencePolicyDigest": "online-pilot:evidence-packet.approvalEvidencePolicyDigest", "authorizationRequestBundleVerificationDigest": "online-pilot:authorization-request-bundle-verify.verificationDigest", "authorizationRequirementsDigest": "online-pilot:evidence-packet.authorizationRequirementsDigest", "nextGateRequestsDigest": "online-pilot:evidence-packet.nextGateRequestsDigest", "payloadDigest": "online-pilot:review-package.payloadDigest", "stateRoot": "caller.localStateRoot"}, "submitEnabled": false, "uploadEnabled": false}, "handoffPackageRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:handoff-package", "requiresStateRoot": true}, "manifestRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:manifest", "requiresStateRoot": true}, "onlinePilotReviewPackageRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "condition": "external_authorization_required_before_submit", "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/online-pilot:review-package", "requiresStateRoot": true}, "payloadRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:payload", "requiresStateRoot": true}, "preflightRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:preflight", "requiresStateRoot": true}, "readinessRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:readiness", "requiresStateRoot": true}, "receiptsRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:receipts", "requiresStateRoot": true}, "statusRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:status", "requiresStateRoot": true}, "submitGateReportRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:submit-gate-report", "requiresStateRoot": true}, "submitPlanRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:submit-plan", "requiresStateRoot": true}, "submitRequest": {"body": {"payloadDigest": "<payloadDigest>"}, "method": "POST", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:submit-request", "requiresStateRoot": true}, "tokenCheckRequest": {"body": {}, "method": "GET", "network": false, "path": "/api/web/v1/plugins/nails/maliang-exports:token-check", "requiresStateRoot": false}}, "route": "/api/web/v1/plugins/nails/offline-contract-mvp:readiness-contract", "schema": {"$id": "https://openeyes.local/plugins/nails/web/v1/offline-contract-mvp-readiness-request.schema.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": {"stateRoot": {"description": "Local state root that contains state/plugins/nails offline MVP evidence.", "minLength": 1, "type": "string"}}, "required": ["stateRoot"], "title": "Nails Offline Contract MVP Readiness Request v1", "type": "object"}, "stateNamespace": "state/plugins/nails", "storyOrder": ["crawl_exports", "design_package", "maliang_dry_run", "handoff_package"]}