{"openapi":"3.1.0","info":{"title":"Bellator Schedule Intelligence APIs","description":"\n    Bellator Schedule Intelligence APIs - Stateless Schedule Health APIs\n\n    ## Features\n\n    * **Schedule Analysis** - Comprehensive schedule health analysis\n    * **Critical Path** - CPM-based critical path calculation\n    * **Validation** - Schedule validation and quality checks\n    * **Future: Resource Management** - Resource allocation and leveling\n    * **Future: Simulation** - Monte Carlo and what-if analysis\n    * **Future: AI Recommendations** - LLM-powered optimization suggestions\n\n    ## Authentication\n\n    API key authentication via `x-api-key` header or OAuth 2.0 Bearer token via `Authorization` header.\n\n    ### API Key Authentication (Legacy)\n    Include API key in `x-api-key` header.\n\n    ### OAuth 2.0 / Azure AD Authentication (Recommended)\n    Include Bearer token in `Authorization` header: `Authorization: Bearer <token>`\n\n    Tiers:\n    - **Free**: 2,000 tasks, 100 req/min, 5MB payload\n    - **Professional**: 5,000 tasks, 500 req/min, 25MB payload\n    - **Enterprise**: 50,000 tasks, 2,000 req/min, 100MB payload\n    - **Government**: 100,000+ tasks, 10,000 req/min, 500MB payload\n\n    ## Usage Metering\n\n    All API requests are metered and tracked for:\n    - Request duration (milliseconds)\n    - Task count processed\n    - Token consumption (for LLM operations)\n    - Estimated cost (USD)\n\n    Metering events are emitted to logs and can be integrated with billing systems.\n\n    ## Security\n\n    * Tier-based task limits (500-100,000 tasks per request)\n    * Tier-based payload limits (5-500 MB)\n    * Input validation and sanitization\n    * Tier-based rate limiting (100-10,000 requests per 60 seconds)\n    ","version":"0.4.0"},"paths":{"/mcp/tools":{"get":{"tags":["MCP"],"summary":"List Mcp Tools","description":"Return MCP tool registry for agent discovery.","operationId":"list_mcp_tools_mcp_tools_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Mcp Tools Mcp Tools Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/tools/{tool_name}":{"post":{"tags":["MCP"],"summary":"Invoke Tool","description":"Invoke MCP tool and dispatch to the locked REST path, not a 308.","operationId":"invoke_tool_mcp_tools__tool_name__post","parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Invoke Tool Mcp Tools  Tool Name  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"tags":["MCP"],"summary":"Mcp Streamable Post","description":"MCP Streamable HTTP. One JSON-RPC message per POST.","operationId":"mcp_streamable_post_mcp_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mcp Streamable Post Mcp Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["MCP"],"summary":"Mcp Streamable Get","description":"Stateless server. No server-initiated stream.","operationId":"mcp_streamable_get_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mcp Streamable Get Mcp Get"}}}}}},"delete":{"tags":["MCP"],"summary":"Mcp Streamable Delete","operationId":"mcp_streamable_delete_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Mcp Streamable Delete Mcp Delete"}}}}}}},"/api/v1/account/tier":{"get":{"tags":["Account"],"summary":"Get current API tier and limits","description":"Returns the subscription tier and limits for the authenticated API key. Used by the official Bellator SI Dashboard for dynamic feature gating. Fully stateless and lightweight.","operationId":"get_account_tier_api_v1_account_tier_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountTierResponse"}}}},"401":{"description":"Invalid or missing API key"},"403":{"description":"API key inactive or suspended"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Internal resolution error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/callback":{"get":{"tags":["Authentication"],"summary":"Oauth Callback","description":"OAuth callback endpoint for External ID authentication.\n\nThis endpoint receives the authorization code after successful login.\nFor now, it just confirms the flow works. In production, this would:\n1. Validate the state parameter (CSRF protection)\n2. Exchange code for access/ID tokens\n3. Validate tokens\n4. Create/update user record\n5. Redirect to app with session cookie\n\nArgs:\n    code: Authorization code from External ID\n    state: State parameter for CSRF validation\n\nReturns:\n    Success message with code details","operationId":"oauth_callback_api_v1_auth_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/signup":{"post":{"tags":["Authentication"],"summary":"Signup User","description":"Sign up new user account only (no automatic API key creation).\n\nFlow:\n1. Validate OAuth token and extract email (required)\n2. Check if user already exists (by email from token)\n3. Create user record if new\n4. Return account status\n\nTrack A Context:\n- Free tier: 1,000 tasks, Tier 1 APIs only\n- Starter tier: 2,000 tasks, Tier 1+2 APIs (requires payment)\n- Pro tier: 5,000 tasks, all APIs with async (requires payment)\n\nSecurity:\n- Email is extracted from validated OAuth token (not trusted from request body)\n- OAuth token is validated by get_current_user_email dependency","operationId":"signup_user_api_v1_auth_signup_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UserSignupRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/keys":{"options":{"tags":["Authentication"],"summary":"Options Keys","description":"Handle CORS preflight for /keys endpoint.\n\nExplicitly handles OPTIONS to ensure CORS works in all browsers.\nCORSMiddleware will add the actual CORS headers.","operationId":"options_keys_api_v1_auth_keys_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Options Keys Api V1 Auth Keys Options"}}}}}},"get":{"tags":["Authentication"],"summary":"List Api Keys","description":"List all API keys for current user.\n\nReturns key metadata only - full keys are never retrieved.","operationId":"list_api_keys_api_v1_auth_keys_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIKeyListItem"},"title":"Response List Api Keys Api V1 Auth Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Authentication"],"summary":"Create Api Key","description":"Generate new API key for an existing user account.\n\nUsers can have multiple API keys (for different environments, rotation, etc.).\nAccount must be created first via /auth/signup.","operationId":"create_api_key_api_v1_auth_keys_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/profile":{"get":{"tags":["Authentication"],"summary":"Get User Profile","description":"Get current authenticated user's profile details.\n\nUsed by frontend forms to prefill contact fields and reduce user friction.","operationId":"get_user_profile_api_v1_auth_profile_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/keys/{key_id}":{"options":{"tags":["Authentication"],"summary":"Options Revoke Key","description":"Handle CORS preflight for DELETE /keys/{key_id}.","operationId":"options_revoke_key_api_v1_auth_keys__key_id__options","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Options Revoke Key Api V1 Auth Keys  Key Id  Options"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication"],"summary":"Revoke Api Key","description":"Revoke an API key.\n\nSoft delete - sets status to 'revoked' instead of deleting record.\nPreserves audit trail and usage history.","operationId":"revoke_api_key_api_v1_auth_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/keys/{key_id}/label":{"patch":{"tags":["Authentication"],"summary":"Update Api Key Label","description":"Update the human-readable label for an API key.\n\nStores the label in the existing `description` column.","operationId":"update_api_key_label_api_v1_auth_keys__key_id__label_patch","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAPIKeyLabelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":"Response Update Api Key Label Api V1 Auth Keys  Key Id  Label Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/account":{"options":{"tags":["Authentication"],"summary":"Options Delete Account","description":"Handle CORS preflight for DELETE /account.","operationId":"options_delete_account_api_v1_auth_account_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Options Delete Account Api V1 Auth Account Options"}}}}}},"delete":{"tags":["Authentication"],"summary":"Delete Account","description":"Permanently delete the authenticated user's account (GDPR Article 17).\n\nCancels any active Stripe subscription first, then hard-deletes the user\nrow. Cascade rules on the DB handle API keys, usage records, and\nsubscriptions automatically.\n\nSecurity:\n- Requires valid OAuth token (re-authenticated identity)\n- Stripe subscription cancelled before DB deletion to avoid billing orphans","operationId":"delete_account_api_v1_auth_account_delete","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/checkout":{"post":{"tags":["Billing"],"summary":"Create Stripe Checkout Session for Starter tier","description":"Creates a Stripe-hosted checkout session for the $29/mo Starter subscription. Requires a valid Entra External ID Bearer token. Redirect the user to `checkout_url` to complete payment.","operationId":"create_checkout_session_api_v1_billing_checkout_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/checkout/reconcile":{"post":{"tags":["Billing"],"summary":"Reconcile completed Stripe checkout session","description":"Retrieves a completed Stripe Checkout Session by session_id and applies the same subscription activation logic as the webhook path. Intended as a local-development fallback when webhook forwarding is unavailable.","operationId":"reconcile_checkout_session_api_v1_billing_checkout_reconcile_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutReconcileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutReconcileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/portal":{"post":{"tags":["Billing"],"summary":"Create Stripe Customer Portal Session","description":"Creates a Stripe Customer Portal session for the authenticated user. Redirect the user to `portal_url` to manage their subscription, update payment methods, or download invoices. Requires an active Stripe customer (i.e., user must have checked out at least once).","operationId":"create_portal_session_api_v1_billing_portal_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/azure-marketplace/webhook":{"post":{"tags":["Billing","Billing"],"summary":"Azure Marketplace Webhook","description":"Handle Azure Marketplace subscription lifecycle events.\n\nThis endpoint is called by Microsoft when a customer subscribes, cancels,\nsuspends, or changes plan via the Azure Marketplace SaaS offer.\n\nSee: azure-marketplace-subscription-webhook-api-specification.md","operationId":"azure_marketplace_webhook_api_v1_billing_azure_marketplace_webhook_post","parameters":[{"name":"x-ms-marketplace-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ms-Marketplace-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Azure Marketplace Webhook Api V1 Billing Azure Marketplace Webhook Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/settlement/overage-export":{"get":{"tags":["Billing","Billing"],"summary":"Export Overage Settlement","description":"Export overage settlement payloads for Stripe/Azure ingestion pipelines.","operationId":"export_overage_settlement_api_v1_billing_settlement_overage_export_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"enum":["all","stripe","azure"],"type":"string","default":"all","title":"Provider"}},{"name":"format","in":"query","required":false,"schema":{"enum":["json","csv"],"type":"string","default":"json","title":"Format"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-settlement-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Settlement-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact/submit":{"post":{"tags":["Contact Form"],"summary":"Submit contact form","description":"Submit a contact form for general inquiries, sales, feedback, waitlist, or newsletter signups.\n\n    **Submission Types:**\n    - `general_inquiry`: General questions about products\n    - `sales`: Enterprise/custom solution inquiries\n    - `feedback`: User feedback from playground (authentication recommended)\n    - `waitlist`: Join waitlist for future tiers (specify waitlist_types)\n    - `newsletter`: Blog / product update list signup (name + email; consent recorded upstream)\n\n    **Spam Prevention:**\n    - reCAPTCHA v3 token required (validated server-side)\n    - Rate limiting: 10 submissions per hour per IP address\n\n    **Response:**\n    - Confirms receipt only — no response-time SLA is promised","operationId":"submit_contact_form_api_v1_contact_submit_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmissionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact/email/diagnostics":{"get":{"tags":["Contact Form"],"summary":"Get contact email diagnostics","description":"Returns non-secret diagnostics for contact email delivery configuration.\n\n    This endpoint is intended for operational troubleshooting and does not expose\n    credential values.","operationId":"get_email_diagnostics_api_v1_contact_email_diagnostics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Email Diagnostics Api V1 Contact Email Diagnostics Get"}}}}}}},"/api/v1/contact/waitlist-types":{"get":{"tags":["Contact Form"],"summary":"Get available waitlist types","description":"Retrieve list of available waitlist types for tier signups.\n\n    Returns only active waitlists that are currently accepting signups.","operationId":"get_waitlist_types_api_v1_contact_waitlist_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WaitlistTypeResponse"},"type":"array","title":"Response Get Waitlist Types Api V1 Contact Waitlist Types Get"}}}}}}},"/api/v1/contact/submission-types":{"get":{"tags":["Contact Form"],"summary":"Get available submission types","description":"Retrieve list of available contact form submission types.\n\n    Returns all active submission types with their requirements.","operationId":"get_submission_types_api_v1_contact_submission_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubmissionTypeResponse"},"type":"array","title":"Response Get Submission Types Api V1 Contact Submission Types Get"}}}}}}},"/api/v1/feedback":{"post":{"tags":["Feedback"],"summary":"Submit playground feedback","description":"Submit authenticated playground feedback through the shared communications pipeline.\n\n    This endpoint exists for frontend compatibility and normalizes payloads into\n    the same contact submission system used by contact and waitlist forms.","operationId":"submit_playground_feedback_api_v1_feedback_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundFeedbackRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/page":{"post":{"tags":["Feedback"],"summary":"Submit docs page helpfulness feedback","description":"Submit lightweight yes/no docs feedback through the shared communications pipeline.\n\n    This channel persists feedback for product analytics and sends support\n    notifications for operational visibility.","operationId":"submit_page_feedback_api_v1_feedback_page_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageFeedbackRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forensics/change-tracking":{"post":{"tags":["Forensics"],"summary":"Time-Series Change Detection","description":"Detects field-level changes across schedule snapshots in six categories.\\n\\n**Change categories:**\\n- `baseline` — unauthorized baseline date/duration modifications (GAO BP-10)\\n- `actual` — retroactive actual date changes (DCMA DECM 06A504a/b)\\n- `forecast` — forecast drift and instability patterns\\n- `logic` — dependency adds/removes/lag modifications\\n- `resource` — resource assignment modifications\\n- `progress` — progress decrease and erratic patterns\\n\\n**Comparison modes:** `all_periods` (default), `latest`, `specific_dates`.\\n\\n**Tier access:** Starter and above.\\n\\n**Output:** `comparison_summary`, `changes_by_category` (all 6 categories), `impact_analysis`, `trends`, `compliance_tags`, `processing_metadata`.","operationId":"change_tracking_api_v1_forensics_change_tracking_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeTrackingRequest"}}}},"responses":{"200":{"description":"Change tracking analysis completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ChangeTrackingData_"}}}},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"422":{"description":"Validation error — check schedule schema or options"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/forensics/change-tracking/async":{"post":{"tags":["Forensics"],"summary":"Time-Series Change Detection (Async)","description":"Submit async change tracking for large schedules. Poll GET /api/v1/jobs/{job_id}.","operationId":"change_tracking_async_api_v1_forensics_change_tracking_async_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeTrackingRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forensics/baseline-compare":{"post":{"tags":["Forensics"],"summary":"Baseline Variance Analysis","description":"Compares the current schedule against an approved baseline to detect variance, drift, and execution performance signals.\\n\\n**Performance indicators:** BEI, Critical Path BEI, SPI(t), variance severity, on-track percentage.\\n\\n**Optional analysis:**\\n- `include_trends` — multi-period variance trend analysis\\n- `include_evms_trends` — EVMS SPI/CPI/EAC indices over time\\n- `include_forecast_trends` — EAC forecast stability tracking\\n- `include_logic_changes` — dependency graph drift detection\\n\\n**Match strategies:** `id` (default), `id_and_wbs`, `wbs_hierarchy`, `fuzzy_id`.\\n\\n**Tier access:** Starter and above.\\n\\n**Standards:** GAO BP-10, DCMA Check #14 (BEI), AACE RP 29R-03.","operationId":"baseline_compare_api_v1_forensics_baseline_compare_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaselineCompareRequest"}}}},"responses":{"200":{"description":"Baseline comparison completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_BaselineCompareData_"}}}},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"422":{"description":"Validation error — check schedule schema or options"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/forensics/baseline-compare/async":{"post":{"tags":["Forensics"],"summary":"Baseline Variance Analysis (Async)","description":"Submit async baseline comparison for large schedules. Poll GET /api/v1/jobs/{job_id}.","operationId":"baseline_compare_async_api_v1_forensics_baseline_compare_async_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaselineCompareRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forensics/delay-analysis":{"post":{"tags":["Forensics"],"summary":"Delay Attribution Analysis","description":"Identifies, quantifies, and attributes schedule delays across four analysis steps.\\n\\n**Steps:**\\n1. Variance detection — identifies delayed tasks vs baseline\\n2. Float analysis — tracks critical path and float consumption\\n3. Causal chains — traces delay propagation through dependency network\\n4. Recommendations — AACE RP 47R-11 prioritized recovery actions\\n\\n**Methodologies:** `windows` (default), `contemporaneous`, `collapsed_as_built`.\\n\\n**Tier access:** Starter and above.\\n\\n**Standards:** AACE RP 29R-03, AACE RP 47R-11.","operationId":"delay_analysis_api_v1_forensics_delay_analysis_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DelayAnalysisRequest"}}}},"responses":{"200":{"description":"Delay analysis completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_DelayAnalysisData_"}}}},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"422":{"description":"Validation error — check schedule schema or options"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/forensics/delay-analysis/async":{"post":{"tags":["Forensics"],"summary":"Delay Attribution Analysis (Async)","description":"Submit async delay analysis for large schedules. Poll GET /api/v1/jobs/{job_id}.","operationId":"delay_analysis_async_api_v1_forensics_delay_analysis_async_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DelayAnalysisRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forensics/as-planned-vs-as-built":{"post":{"tags":["Forensics"],"summary":"As-Planned vs. As-Built Comparison","description":"Compares the original as-planned schedule against actual execution (as-built), identifying task-level variance and execution performance.\\n\\n**Output:**\\n- Per-task variance (start/finish/duration)\\n- Variance classification (on_time, minor_slip, moderate_slip, severe_slip, early_completion, incomplete)\\n- Critical path overlay (planned vs. actual CP)\\n\\n**Optional analysis:**\\n- `include_logic_diff` — detect added/removed/modified dependencies\\n- `include_resource_diff` — compare resource assignment changes\\n\\n**Match strategies:** `exact_id` (default), `fuzzy_name`, `wbs`.\\n\\n**Tier access:** Starter and above.\\n\\n**Standards:** AACE RP 29R-03 (Forensic Schedule Analysis).","operationId":"as_planned_vs_as_built_api_v1_forensics_as_planned_vs_as_built_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsPlannedVsAsBuiltRequest"}}}},"responses":{"200":{"description":"As-planned vs. as-built comparison completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_AsPlannedVsAsBuiltData_"}}}},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"422":{"description":"Validation error — check schedule schema or options"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/forensics/as-planned-vs-as-built/async":{"post":{"tags":["Forensics"],"summary":"As-Planned vs. As-Built Comparison (Async)","description":"Submit async as-planned vs. as-built comparison for large schedules. Poll GET /api/v1/jobs/{job_id}.","operationId":"as_planned_vs_as_built_async_api_v1_forensics_as_planned_vs_as_built_async_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsPlannedVsAsBuiltRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/validate":{"post":{"tags":["Analysis"],"summary":"Validate Schedule","description":"Validate schedule for errors and warnings","operationId":"analysis_validate","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ValidationData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/cpm":{"post":{"tags":["Analysis"],"summary":"Calculate Critical Path","description":"Calculate Critical Path Method for a schedule.\n\nThis endpoint performs two-pass CPM calculation (forward + backward pass)\nto determine critical path, project duration, and task timing.\n\n**Algorithm Steps:**\n1. Dependency parsing & DAG construction\n2. Forward pass (calculate early dates)\n3. Backward pass (calculate late dates)\n4. Float calculation (total float, free float)\n5. Critical path identification\n\n**Standards Compliance:**\n- DCMA Check #12: Critical Path Test\n- GAO BP-6: Maintain Valid Critical Path\n- PMBOK 6.5.2.2: Critical Path Method\n- AACE RP 27R-03: Schedule Flexibility\n\n**Task Limits:**\n- Minimum: 1 task\n- Maximum: 10,000 tasks (synchronous processing only)\n- For larger schedules, use async health score API\n\n**Dependency Format:**\n- Simple: [\"T1\", \"T2\"] (assumes FS with zero lag)\n- Rich: [\"T1FS+2 d\", \"T2SS-1 d\"] (relationship type + lag)\n\n**Response Time:**\n- 1-100 tasks: <10ms\n- 101-500 tasks: <25ms\n- 501-1,000 tasks: <50ms\n- 1,001-5,000 tasks: <200ms\n- 5,001-10,000 tasks: <500ms\n\nArgs:\n    request: CPM calculation request with tasks and options\n    api_key: API key for authentication (injected)\n    protection: Bot detection and rate limiting results\n\nReturns:\n    CPMResponse with critical path, task timing, and optional network details\n\nRaises:\n    HTTPException 400: Invalid request (malformed JSON, validation errors, cycles)\n    HTTPException 401: Invalid API key\n    HTTPException 429: Rate limit exceeded\n    HTTPException 500: Internal server error","operationId":"analysis_cpm","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPMRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_CPMData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/resources":{"post":{"tags":["Analysis"],"summary":"Resource Analysis","description":"Run a time-phased resource analysis on a schedule.\n\nAccepts a schedule payload (tasks), optional resource availability\ndeclarations, and analysis options. Returns demand profiles per resource,\nover-allocation periods, leveling candidates, and a composite risk score.","operationId":"analysis_resources","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAnalysisRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ResourceAnalysisData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/cpm/async":{"post":{"tags":["Analysis"],"summary":"Calculate Critical Path (Async)","description":"Submit CPM calculation as async job (for large schedules >1,000 tasks).\n\nThis endpoint queues a CPM calculation job for background processing.\nUse GET /api/v1/jobs/{job_id} to poll for completion.\n\n**Tier Restrictions:**\n- Demo/Free: Blocked (use sync endpoint ≤1,000 tasks)\n- Starter+: Allowed\n\n**Task Limits:**\n- Starter: 2,000 tasks\n- Professional: 5,000 tasks\n- Enterprise: 50,000 tasks\n- Government: 100,000 tasks\n\nArgs:\n    request: CPM calculation request\n    api_key: API key for authentication\n\nReturns:\n    Job submission response with job_id and polling_url\n\nRaises:\n    HTTPException 402: Task count exceeds tier limit\n    HTTPException 403: Async not available for tier (demo/free)","operationId":"analysis_cpm_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPMRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/resources/async":{"post":{"tags":["Analysis"],"summary":"Resource Analysis (Async)","description":"Submit resource analysis as async job.","operationId":"analysis_resources_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAnalysisRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/score":{"post":{"tags":["health"],"summary":"Calculate Schedule Health Score","description":"Calculate comprehensive schedule health score (0-100) based on deterministic analysis.\n\nThis endpoint performs:\n- DAG construction and validation\n- Critical Path Method (CPM) calculation\n- Float analysis and erosion detection\n- Critical path density evaluation\n- Structural integrity assessment\n- Weighted composite scoring per DCMA/GAO/AACE standards\n\n**Performance Target:** Response time <5s for 1,000 tasks (Phase 1A)\n\n**Task Limits:**\n- Synchronous processing: up to 1,000 tasks\n- Tier-based limits: Free (500), Professional (5,000), Enterprise (50,000+)\n\n**Compliance:**\n- DCMA 14-Point Assessment\n- GAO Schedule Assessment Guide\n- AACE RP 92R-19 (Schedule Health Metrics)\n- PMBOK 8 Section 4.5","operationId":"calculate_health_score_api_v1_health_score_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleInput"}}}},"responses":{"200":{"description":"Success - Health score calculated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_HealthScoreData_"}}}},"402":{"description":"Payment Required - Tier limit exceeded","content":{"application/json":{"example":{"detail":"Task count (1500) exceeds tier limit (1000). Use async endpoint or upgrade tier.","type":"tier_limit_exceeded","upgrade_url":"/docs#/Authentication"}}}},"422":{"description":"Unprocessable Entity - Validation error","content":{"application/json":{"example":{"detail":[{"loc":["body","tasks",0,"duration_days"],"msg":"ensure this value is greater than or equal to 0","type":"value_error"}]}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}}}}},"/api/v1/health/logic-audit":{"post":{"tags":["health"],"summary":"Logic Audit","description":"Run a full logic audit on a schedule.\n\nAccepts a list of tasks and optional audit configuration options.\nReturns a scored, graded report with per-rule results and prioritized\nrecommended fixes.","operationId":"health_logic_audit","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogicAuditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_LogicAuditData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/progress-audit":{"post":{"tags":["health"],"summary":"Progress Audit","description":"Run a full progress integrity audit on a schedule.\n\nAccepts a list of tasks and required audit options (including status_date).\nReturns a scored, graded report with per-anomaly details and prioritized\nremediation recommendations.","operationId":"health_progress_audit","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressAuditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ProgressAuditData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/dcma-14-point":{"post":{"tags":["health"],"summary":"DCMA 14-Point Assessment","description":"Run a full DCMA 14-Point assessment on a schedule.\n\nAccepts a schedule payload (tasks + metadata) and optional assessment options.\nReturns per-check results, overall pass/warning/fail status, threshold metadata,\nand prioritized remediation recommendations.","operationId":"health_dcma_14_point","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DCMA14PointRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_DCMA14PointData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/dcma-decm":{"post":{"tags":["health"],"summary":"DCMA DECM Assessment","description":"Run a DCMA DECM Tier 2 schedule compliance assessment.\n\nAccepts a schedule payload (tasks + metadata), optional schedule history for\nretroactive date change detection, and assessment options.\nReturns check results grouped by EVM Guideline with overall pass/warning/fail\nstatus and prioritized remediation recommendations.","operationId":"health_dcma_decm","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DCMADECMRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_DCMADECMData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/planning-horizon":{"post":{"tags":["health"],"summary":"Planning Horizon","description":"Analyze work-readiness for upcoming tasks within horizon bands.\n\nAccepts a current schedule with status date and optional schedule history.\nReturns per-band readiness scores, at-risk tasks, and recommendations.","operationId":"health_planning_horizon","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningHorizonRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_PlanningHorizonData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/schedule-risk-index":{"post":{"tags":["health"],"summary":"Schedule Risk Index","description":"Compute composite Schedule Risk Index across five sub-metrics.\n\nAccepts a schedule with optional baseline dates, actuals, and resource fields.\nSub-metrics are activated automatically based on available data (sub_metrics=\"auto\").\nReturns composite score, per-sub-metric breakdown, top risk drivers, and\nactionable recommendations.","operationId":"health_schedule_risk_index","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRiskIndexRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ScheduleRiskIndexData_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/logic-audit/async":{"post":{"tags":["health"],"summary":"Logic Audit (Async)","description":"Submit logic audit as async job.","operationId":"health_logic_audit_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogicAuditRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/progress-audit/async":{"post":{"tags":["health"],"summary":"Progress Audit (Async)","description":"Submit progress audit as async job.","operationId":"health_progress_audit_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressAuditRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/dcma-14-point/async":{"post":{"tags":["health"],"summary":"DCMA 14-Point Assessment (Async)","description":"Submit DCMA 14-Point assessment as async job.","operationId":"health_dcma_14_point_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DCMA14PointRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/dcma-decm/async":{"post":{"tags":["health"],"summary":"DCMA DECM Assessment (Async)","description":"Submit DCMA DECM assessment as async job.","operationId":"health_dcma_decm_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DCMADECMRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/planning-horizon/async":{"post":{"tags":["health"],"summary":"Planning Horizon (Async)","description":"Submit planning horizon analysis as async job.","operationId":"health_planning_horizon_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningHorizonRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/schedule-risk-index/async":{"post":{"tags":["health"],"summary":"Schedule Risk Index (Async)","description":"Submit schedule risk index as async job.","operationId":"health_schedule_risk_index_async","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRiskIndexRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health/score/async":{"post":{"tags":["health"],"summary":"Submit Async Health Score Job","description":"Submit asynchronous health score calculation job for large schedules.\n\nThis endpoint queues a job for background processing and returns immediately\nwith a job ID. Use the job status endpoint to poll for completion.\n\n**Use Cases:**\n- Schedules with 5,000-10,000+ tasks\n- Batch processing of multiple schedules\n- Integration with external systems via webhooks\n\n**Performance:**\n- Target completion: <30 seconds for 5,000 tasks\n- Webhook delivery: <5 seconds after completion\n- Job result TTL: 24 hours\n\n**Tier Limits:**\n- Free: 2,000 tasks\n- Professional: 5,000 tasks\n- Enterprise: 50,000 tasks\n- Government: 100,000+ tasks\n\n**Webhook Delivery:**\n- Optional callback URL for result delivery\n- Retry logic: 3 attempts with exponential backoff\n- Events: job.completed, job.failed\n\n**Compliance:**\n- DCMA 14-Point Assessment\n- GAO Schedule Assessment Guide\n- AACE RP 92R-19 (Schedule Health Metrics)\n- PMBOK 8 Section 4.5","operationId":"submit_async_health_score_api_v1_health_score_async_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionRequest"}}}},"responses":{"202":{"description":"Accepted - Job queued successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmissionResponse"},"example":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"queued","estimated_completion_seconds":15,"status_url":"/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000","created_at":"2025-01-08T12:00:00Z"}}}},"402":{"description":"Payment Required - Tier limit exceeded","content":{"application/json":{"example":{"detail":"Task count (10000) exceeds tier limit (5000). Upgrade to Enterprise tier.","type":"tier_limit_exceeded","upgrade_url":"/docs#/Authentication"}}}},"403":{"description":"Forbidden - Async access not available for tier","content":{"application/json":{"example":{"detail":"Async endpoints are not available for demo tier. Async processing requires Starter tier or higher. Please upgrade your tier or use synchronous endpoints (≤1,000 tasks)."}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"503":{"description":"Service Unavailable - Queue at capacity","content":{"application/json":{"example":{"detail":"Job queue is at capacity. Please try again later.","type":"queue_at_capacity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Get Job Status","description":"Poll async job status and retrieve result when completed.\n\nThis unified endpoint serves all async operations including:\n- Health score calculations\n- Forensics analysis (logic audit, DCMA 14-point, etc.)\n- CPM calculations\n- Resource analysis\n- And all other async endpoints\n\n**Job Lifecycle:**\n1. **queued** - Job submitted, waiting for worker\n2. **processing** - Worker executing job\n3. **completed** - Job finished successfully, result available\n4. **failed** - Job encountered error\n5. **cancelled** - Job cancelled by user\n\n**Progress Tracking:**\n- `progress_percent`: Overall progress (0-100)\n- `checks_completed` / `total_checks`: Granular progress for forensics endpoints\n\n**Polling Recommendations:**\n- Initial delay: 5 seconds\n- Interval: 2-5 seconds\n- Exponential backoff for long-running jobs\n\n**Result Expiration:**\n- Job results are stored for 24 hours\n- After expiration, job status returns 404","operationId":"get_async_job_status_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Success - Job status retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"},"examples":{"queued":{"summary":"Job queued","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"queued","created_at":"2025-01-08T12:00:00Z","task_count":5000,"progress_percent":0.0,"endpoint_name":"forensics/logic-audit"}},"processing":{"summary":"Job processing with progress","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"processing","created_at":"2025-01-08T12:00:00Z","started_at":"2025-01-08T12:00:05Z","task_count":5000,"progress_percent":50.0,"endpoint_name":"forensics/dcma-14-point","checks_completed":7,"total_checks":14}},"completed":{"summary":"Job completed","value":{"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"completed","created_at":"2025-01-08T12:00:00Z","started_at":"2025-01-08T12:00:05Z","completed_at":"2025-01-08T12:00:20Z","task_count":5000,"result":{"score":85.5,"breakdown":{"criticality_score":90.0,"float_erosion_score":85.0},"top_signals":["High critical path density"],"confidence":0.95},"progress_percent":100.0,"endpoint_name":"health/score"}}}}}},"404":{"description":"Not Found - Job does not exist or has expired","content":{"application/json":{"example":{"detail":"Job not found: 550e8400-e29b-41d4-a716-446655440000"}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Jobs"],"summary":"Delete Job","description":"Delete a completed, failed, or cancelled job result.\n\n**Deletion Rules:**\n- Only completed, failed, or cancelled jobs can be deleted\n- Queued or processing jobs cannot be deleted (return 409 Conflict)\n- Job data is permanently removed from Redis\n\n**Use Cases:**\n- Cleanup after retrieving results\n- Remove sensitive job data\n- Free up storage space","operationId":"delete_job_api_v1_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"204":{"description":"No Content - Job deleted successfully"},"409":{"description":"Conflict - Job is still queued or processing","content":{"application/json":{"example":{"detail":"Cannot delete job while it is still processing. Cancel the job first."}}}},"404":{"description":"Not Found - Job does not exist","content":{"application/json":{"example":{"detail":"Job not found: 550e8400-e29b-41d4-a716-446655440000"}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel Job","description":"Cancel a queued or processing job.\n\n**Cancellation Rules:**\n- Only queued or processing jobs can be cancelled\n- Completed, failed, or already cancelled jobs cannot be cancelled\n- Celery task is revoked (terminated) if currently executing\n\n**Use Cases:**\n- User-initiated cancellation\n- Timeout or resource constraints\n- Superseded by newer job submission","operationId":"cancel_async_job_api_v1_jobs__job_id__cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Success - Job cancelled","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Async Job Api V1 Jobs  Job Id  Cancel Post"},"example":{"job_id":"550e8400-e29b-41d4-a716-446655440000","cancelled":true,"message":"Job successfully cancelled"}}}},"400":{"description":"Bad Request - Job cannot be cancelled","content":{"application/json":{"example":{"detail":"Job cannot be cancelled: already completed"}}}},"404":{"description":"Not Found - Job does not exist","content":{"application/json":{"example":{"detail":"Job not found: 550e8400-e29b-41d4-a716-446655440000"}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/import/mpp":{"post":{"tags":["Import"],"summary":"Import MS Project XML Schedule","description":"Parses an MS Project XML file (exported from MS Project as XML) and returns a Normalized Schedule JSON object compatible with all analysis APIs.\n\n**Tier access:** Starter and above.\n\n**File size limit:** 50 MB.\n\n**Input:** XML file content as a UTF-8 string in the `file_content` field.\n\n**Output:** `normalized_schedule` (ready to submit to `/health/score`, `/forensics/dcma-14-point`, etc.) plus `parse_summary`, `mapping_stats`, `warnings`, and `processing_metadata`.","operationId":"import_mpp_api_v1_import_mpp_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MppImportRequest"}}}},"responses":{"200":{"description":"Schedule successfully parsed and normalized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ImportData_"},"example":{"status":"info","metadata":{"task_count":25,"endpoint":"/api/v1/import/mpp","api_version":"v0.2.0","processing_time_ms":450},"data":{"normalized_schedule":{"tasks":[{"id":"1","name":"Project Kickoff","duration_days":0.0,"predecessors":[],"task_type":"milestone"}],"start_task_ids":["1"],"finish_task_ids":["5"]},"parse_summary":{"source_format":"mpp-xml","tasks_imported":25,"dependencies_imported":22},"mapping_stats":{},"warnings":[],"processing_metadata":{"import_timestamp":"2026-05-27T12:00:00Z","processing_time_ms":450,"api_version":"v0.2.0","parser_version":"1.1.0"}}}}}},"400":{"description":"Missing required field (file_content)"},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"415":{"description":"Unsupported media type (binary .mpp instead of XML)"},"422":{"description":"Semantic parse error — invalid XML, circular dependency, duplicate task IDs"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/import/xer":{"post":{"tags":["Import"],"summary":"Import Primavera P6 XER Schedule","description":"Parses a Primavera P6 XER file and returns a Normalized Schedule JSON object compatible with all analysis APIs.\n\n**Tier access:** Starter and above.\n\n**File size limit:** 100 MB.\n\n**Input:** XER file content as a UTF-8 or Latin-1 string in the `file_content` field.\n\n**Multi-project XER:** If the XER file contains multiple projects, specify `options.project_id` to select the target project. Omitting `project_id` when multiple projects are present returns a 422 error listing available project IDs.\n\n**Output:** `normalized_schedule` (ready to submit to `/health/score`, `/forensics/dcma-14-point`, etc.) plus `parse_summary`, `mapping_stats`, `warnings`, and `processing_metadata`.","operationId":"import_xer_api_v1_import_xer_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XerImportRequest"}}}},"responses":{"200":{"description":"Schedule successfully parsed and normalized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BellatorResponse_ImportData_"},"example":{"status":"info","metadata":{"task_count":120,"endpoint":"/api/v1/import/xer","api_version":"v0.2.0","processing_time_ms":380},"data":{"normalized_schedule":{"tasks":[{"id":"A1000","name":"Project Kickoff","duration_days":0.0,"predecessors":[],"task_type":"milestone"}],"start_task_ids":["A1000"],"finish_task_ids":["A9900"]},"parse_summary":{"source_format":"p6-xer","tasks_imported":120,"dependencies_imported":145},"mapping_stats":{},"warnings":[],"processing_metadata":{"import_timestamp":"2026-05-27T12:00:00Z","processing_time_ms":380,"api_version":"v0.2.0","parser_version":"1.1.0"}}}}}},"400":{"description":"Missing required field (file_content)"},"402":{"description":"Tier limit exceeded — Starter tier or above required"},"422":{"description":"Semantic parse error — malformed XER, multi-project ambiguity, circular dependency, or duplicate task IDs"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/simulation/monte-carlo":{"post":{"tags":["Simulation & Analysis"],"summary":"Monte Carlo Simulation (Placeholder)","description":"Monte Carlo simulation for schedule risk analysis - not yet implemented","operationId":"run_monte_carlo_api_v1_simulation_monte_carlo_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonteCarloRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonteCarloResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/simulation/what-if":{"post":{"tags":["Simulation & Analysis"],"summary":"What-If Analysis (Placeholder)","description":"What-if scenario analysis - not yet implemented","operationId":"run_what_if_api_v1_simulation_what_if_post","parameters":[{"name":"scenario","in":"query","required":false,"schema":{"type":"string","default":"baseline","title":"Scenario"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/allocate":{"post":{"tags":["Resource Management"],"summary":"Allocate Resources (Placeholder)","description":"Resource allocation optimization - not yet implemented","operationId":"allocate_resources_api_v1_resources_allocate_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/level":{"post":{"tags":["Resource Management"],"summary":"Resource Leveling (Placeholder)","description":"Resource leveling optimization - not yet implemented","operationId":"level_resources_api_v1_resources_level_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/infrastructure/health/redis":{"get":{"tags":["Infrastructure"],"summary":"Redis Health Check","description":"Check Redis connection health.\n\nReturns detailed Redis health information including:\n- Connection status\n- Ping latency\n- Server version\n- Memory usage\n- Connected clients\n- Uptime\n\nReturns:\n    Redis health status dictionary\n\nResponses:\n    200: Redis is healthy and reachable\n    503: Redis is unreachable or unhealthy (connection: false in response)\n\nExample:\n    ```json\n    {\n        \"connected\": true,\n        \"latency_ms\": 1.2,\n        \"version\": \"7.0.0\",\n        \"memory_used_mb\": 2.5,\n        \"connected_clients\": 3,\n        \"uptime_seconds\": 3600\n    }\n    ```","operationId":"redis_health_check_api_v1_infrastructure_health_redis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redis Health Check Api V1 Infrastructure Health Redis Get"}}}}}}},"/api/v1/infrastructure/health":{"get":{"tags":["Infrastructure"],"summary":"Infrastructure Health","description":"Check overall infrastructure health.\n\nAggregates health status from all infrastructure components:\n- Redis (job queue)\n\nReturns:\n    Overall infrastructure health status\n\nResponses:\n    200: All infrastructure components are healthy\n    503: One or more components are unhealthy\n\nExample:\n    ```json\n    {\n        \"status\": \"healthy\",\n        \"components\": {\n            \"redis\": {\n                \"connected\": true,\n                \"latency_ms\": 1.2\n            }\n        }\n    }\n    ```","operationId":"infrastructure_health_api_v1_infrastructure_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Infrastructure Health Api V1 Infrastructure Health Get"}}}}}}},"/api/v1/webhooks/register":{"post":{"tags":["webhooks"],"summary":"Register Webhook","description":"Register webhook callback URL for async job notifications.\n\n**Webhook Events:**\n- `job.completed` - Job finished successfully\n- `job.failed` - Job encountered error\n- `job.cancelled` - Job was cancelled\n\n**Webhook Payload:**\n```json\n{\n    \"event\": \"job.completed\",\n    \"job_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"timestamp\": \"2025-01-08T12:00:25Z\",\n    \"data\": {\n        \"job_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n        \"status\": \"completed\",\n        \"result\": {...}\n    }\n}\n```\n\n**Signature Verification:**\n- HMAC-SHA256 signature in `X-Bellator-Signature` header\n- Format: `sha256=<hex_signature>`\n- Payload: JSON-serialized webhook payload (deterministic order)\n\n**Delivery Guarantees:**\n- At-least-once delivery\n- Max 3 retry attempts with exponential backoff\n- 5 second initial retry delay, 15 second max delay\n- Target delivery: <5 seconds after job completion\n\n**Best Practices:**\n- Return 2xx status code quickly (<1 second)\n- Process webhook payload asynchronously\n- Verify signature if secret provided\n- Implement idempotency using job_id","operationId":"register_webhook_api_v1_webhooks_register_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegistration"}}}},"responses":{"200":{"description":"Success - Webhook registered","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"title":"Response Register Webhook Api V1 Webhooks Register Post"},"example":{"status":"registered","webhook_id":"wh_abc123","url":"https://customer.example.com/webhooks/bellator","events":["job.completed","job.failed"],"message":"Webhook registered successfully. Will be used for all async jobs."}}}},"400":{"description":"Bad Request - Invalid webhook configuration","content":{"application/json":{"example":{"detail":"Invalid URL format or event types"}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/registration":{"get":{"tags":["webhooks"],"summary":"Get Webhook Registration","description":"Get the current webhook registration for the authenticated tenant.\n\nReturns the registered webhook URL, events, and metadata.","operationId":"get_webhook_registration_api_v1_webhooks_registration_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Success - Webhook registration found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Webhook Registration Api V1 Webhooks Registration Get"},"example":{"webhook_id":"wh_abc123","url":"https://customer.example.com/webhooks/bellator","events":["job.completed","job.failed"],"created_at":"2025-01-08T12:00:00Z"}}}},"404":{"description":"Not Found - No webhook registration found","content":{"application/json":{"example":{"detail":"No webhook registration found for this tenant"}}}},"429":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"example":{"detail":"Rate limit exceeded. Maximum 500 requests per 60 seconds.","type":"rate_limit_exceeded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook Registration","description":"Delete the webhook registration for the authenticated tenant.\n\nAfter deletion, no webhooks will be sent for future async jobs.","operationId":"delete_webhook_registration_api_v1_webhooks_registration_delete","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Webhook Registration Api V1 Webhooks Registration Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/deliveries/{webhook_id}":{"get":{"tags":["webhooks"],"summary":"Get Delivery Status","description":"Get delivery status for a specific webhook delivery attempt.\n\nReturns delivery metadata including attempts, success status, and errors.","operationId":"get_delivery_status_api_v1_webhooks_deliveries__webhook_id__get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Delivery Status Api V1 Webhooks Deliveries  Webhook Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/deliveries/job/{job_id}":{"get":{"tags":["webhooks"],"summary":"Get Job Deliveries","description":"Get all webhook delivery attempts for a specific job.\n\nReturns a list of all delivery attempts made for this job,\nincluding successes and failures.","operationId":"get_job_deliveries_api_v1_webhooks_deliveries_job__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Job Deliveries Api V1 Webhooks Deliveries Job  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/dlq":{"get":{"tags":["webhooks"],"summary":"Get Dead Letter Queue","description":"Get entries from the webhook dead letter queue (DLQ).\n\nThe DLQ contains webhooks that permanently failed after all retry attempts.\nUse for monitoring and debugging webhook delivery issues.\n\n**Query Parameters:**\n- `limit`: Maximum number of entries to return (default: 100, max: 1000)\n- `offset`: Number of entries to skip for pagination (default: 0)","operationId":"get_dlq_api_v1_webhooks_dlq_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-bellator-internal-dispatch","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bellator-Internal-Dispatch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Dlq Api V1 Webhooks Dlq Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/metadata":{"get":{"tags":["compliance"],"summary":"Get Compliance Metadata","description":"Get compliance metadata for all core analysis functions.\n\nReturns compliance standards traceability information showing which\nDCMA, GAO, AACE, and PMBOK standards are implemented by each function.\n\nThis endpoint enables:\n- Compliance dashboard features\n- Audit trail documentation\n- Standards coverage reporting\n\nReturns:\n    Dictionary with compliance metadata for all core functions","operationId":"get_compliance_metadata_api_v1_compliance_metadata_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Compliance Metadata Api V1 Compliance Metadata Get"}}}}}}},"/api/v1/compliance/metadata/{function_name}":{"get":{"tags":["compliance"],"summary":"Get Function Compliance Metadata","description":"Get compliance metadata for a specific function.\n\nArgs:\n    function_name: Name of the function to query\n\nReturns:\n    Dictionary with compliance metadata for the specified function\n\nRaises:\n    HTTPException: 404 if function not found","operationId":"get_function_compliance_metadata_api_v1_compliance_metadata__function_name__get","parameters":[{"name":"function_name","in":"path","required":true,"schema":{"type":"string","title":"Function Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Function Compliance Metadata Api V1 Compliance Metadata  Function Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys/ephemeral/generate":{"post":{"tags":["API Keys"],"summary":"Generate Ephemeral API Key","description":"Generate a new ephemeral API key for playground use.\n\n**No authentication required.** Returns a temporary key that:\n- Expires after 24 hours\n- Limited to 100 API calls\n- Tracked individually (not shared between users)\n- Auto-deletes when expired\n\n**Use Cases:**\n- Playground users exploring the API\n- Quick testing without signup\n- Trial integrations\n\n**Upgrade Path:**\nWhen limits are reached, users can:\n1. Generate a new ephemeral key (instant, no signup)\n2. Sign up for unlimited access at https://www.bellatorsi.com/pricing\n\n**Security:**\n- Keys are cryptographically secure (128-bit entropy)\n- Usage tracked per key for abuse prevention\n- Automatic expiry prevents key leakage issues","operationId":"generate_ephemeral_key_api_v1_keys_ephemeral_generate_post","responses":{"201":{"description":"Ephemeral key generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EphemeralKeyResponse"}}}},"429":{"description":"Generation rate limit exceeded — caller has generated too many keys today (default: 5 keys/IP/day).  Retry tomorrow or sign up for unlimited access."},"503":{"description":"Key generation temporarily unavailable — Redis backend is unreachable and the service is configured in fail-closed mode.  Retry shortly."},"500":{"description":"Failed to generate key (unexpected internal error)"}}}},"/api/v1/keys/ephemeral/generate/agent":{"post":{"tags":["API Keys"],"summary":"Generate Agent Ephemeral Key","description":"Issue a no-signup agent key at the free tier. Same mint, different tier.","operationId":"generate_agent_key_api_v1_keys_ephemeral_generate_agent_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EphemeralKeyResponse"}}}}}}},"/api/v1/keys/ephemeral/info":{"get":{"tags":["API Keys"],"summary":"Get Key Usage Info","description":"Get usage information for current ephemeral key.\n\n**Authentication Required:** Include ephemeral key in `X-API-Key` header.\n\nReturns:\n- Usage count and remaining calls\n- Time until expiry\n- Key validity status\n\n**Use Cases:**\n- Display usage meter in playground UI\n- Warn users when approaching limits\n- Trigger upgrade prompts","operationId":"get_key_info_api_v1_keys_ephemeral_info_get","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Key information retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyUsageInfoResponse"}}}},"404":{"description":"Key not found or expired"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys/ephemeral/revoke":{"delete":{"tags":["API Keys"],"summary":"Revoke Ephemeral Key","description":"Revoke current ephemeral key immediately.\n\n**Authentication Required:** Include ephemeral key in `X-API-Key` header.\n\n**Use Cases:**\n- User explicitly requests key deletion\n- Security: User suspects key compromise\n- Privacy: User wants to clear session data\n\n**Note:** Keys auto-expire after 24 hours, so manual revocation is optional.","operationId":"revoke_key_api_v1_keys_ephemeral_revoke_delete","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Key revoked successfully or not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sandbox/fixtures":{"get":{"tags":["Sandbox"],"summary":"List Sandbox Fixtures","description":"List all available sandbox fixtures.\n\nReturns the full fixture catalog with metadata. No authentication required.\n\nUse fixture names as the `schedule_fixture` value in any analysis request body\nto run the endpoint against pre-loaded data without supplying a `tasks` array.\n\n**Example request using a fixture:**\n```json\nPOST /api/v1/forensics/dcma-14-point\n{\n  \"schedule_fixture\": \"dcma_violations_sample\",\n  \"options\": { \"threshold_percent\": 10 }\n}\n```\n\n**Sandbox policy:**\n- Fixture requests do not consume monthly quota or rate-limit credits\n- Fixture requests still require a valid API key\n- All endpoint options apply normally to fixture data\n- Fixture data is read-only and versioned with the API minor version","operationId":"list_sandbox_fixtures_api_v1_sandbox_fixtures_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxFixtureCatalog"}}}}}}},"/api/v1/usage/me":{"get":{"tags":["Usage & Quota"],"summary":"Get My Usage","description":"Return current user's aggregate usage + quota for the current billing month.\n\nUses existing `APIUsageHourly.call_count` aggregation (no new tables required for Phase 1).\nTask telemetry is retained for dashboard visibility but does not gate monthly quota.","operationId":"get_my_usage_api_v1_usage_me_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageMeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/keys/{key_id}":{"get":{"tags":["Usage & Quota"],"summary":"Get Key Usage","description":"Return detailed usage for one API key owned by the authenticated user.","operationId":"get_key_usage_api_v1_usage_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageKeyDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/export":{"get":{"tags":["Usage & Quota"],"summary":"Export Usage","description":"Export usage data for enterprise/government users in JSON or CSV.\n\nPhase 3 scope: monetization-ready export API with cost attribution.","operationId":"export_usage_api_v1_usage_export_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Format"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"UTC export start timestamp","title":"Start"},"description":"UTC export start timestamp"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"UTC export end timestamp","title":"End"},"description":"UTC export end timestamp"},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Health check endpoint.\n\nReturns:\n    Status and version information","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["Root"],"summary":"Root","description":"Root endpoint with API information.\n\nReturns:\n    API information and links","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"APIKeyListItem":{"properties":{"key_id":{"type":"string","format":"uuid","title":"Key Id"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"$ref":"#/components/schemas/APITier"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"total_requests":{"type":"integer","title":"Total Requests"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"User-defined label for this key"}},"type":"object","required":["key_id","key_prefix","tier","status","created_at","last_used_at","total_requests"],"title":"APIKeyListItem","description":"API key list item (no full key)."},"APIKeyResponse":{"properties":{"key_id":{"type":"string","format":"uuid","title":"Key Id"},"key_prefix":{"type":"string","title":"Key Prefix","description":"First 16 chars of key (for identification)"},"full_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Key","description":"Full API key - ONLY returned on creation, store securely!"},"tier":{"$ref":"#/components/schemas/APITier"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"total_requests":{"type":"integer","title":"Total Requests"}},"type":"object","required":["key_id","key_prefix","tier","status","created_at","last_used_at","total_requests"],"title":"APIKeyResponse","description":"API key response.\n\nSECURITY: Full key is only returned once on creation.\nSubsequent requests show only the prefix (first 16 chars)."},"APITier":{"type":"string","enum":["demo","free","starter","professional","enterprise","government"],"title":"APITier","description":"API access tiers with associated limits."},"AccountTierMetadata":{"properties":{"resolved_at":{"type":"string","title":"Resolved At","description":"UTC ISO 8601 timestamp of tier resolution."},"api_version":{"type":"string","title":"Api Version","description":"API version that produced this response."}},"type":"object","required":["resolved_at","api_version"],"title":"AccountTierMetadata","description":"Audit context for the tier resolution.\n\nAttributes:\n    resolved_at: UTC ISO 8601 timestamp when the tier was resolved.\n    api_version: API version that produced this response."},"AccountTierResponse":{"properties":{"tier":{"type":"string","title":"Tier","description":"Lowercase tier identifier: demo | free | starter | professional | enterprise | government"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable tier display name."},"limits":{"$ref":"#/components/schemas/TierLimits"},"capabilities":{"$ref":"#/components/schemas/TierCapabilities"},"recommended_routes":{"additionalProperties":{"type":"string"},"type":"object","title":"Recommended Routes","description":"Accessible API route templates filtered to this tier's capabilities."},"metadata":{"$ref":"#/components/schemas/AccountTierMetadata"}},"type":"object","required":["tier","display_name","limits","capabilities","recommended_routes","metadata"],"title":"AccountTierResponse","description":"Response model for GET /api/v1/account/tier.\n\nNot wrapped in BellatorResponse[T]. This is an identity and capability\nendpoint — no schedule is submitted, no pass/fail evaluation is made,\nand findings/recommendations are not applicable.\n\nAttributes:\n    tier: Lowercase tier identifier.\n    display_name: Human-readable tier display name.\n    limits: Numeric limits for this tier.\n    capabilities: Boolean feature flags for dashboard gating.\n    recommended_routes: Accessible API route templates for this tier.\n    metadata: Audit context — resolution timestamp and API version."},"ActualCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"dcma_decm_violations":{"items":{"$ref":"#/components/schemas/DCMADECMViolationRecord"},"type":"array","title":"Dcma Decm Violations"},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"ActualCategoryResult","description":"Result for actual date change category (includes DCMA DECM violations)."},"AddedRelationship":{"properties":{"predecessor_id":{"type":"string","title":"Predecessor Id"},"successor_id":{"type":"string","title":"Successor Id"},"relationship_type":{"type":"string","title":"Relationship Type","default":"FS"},"lag_days":{"type":"integer","title":"Lag Days","default":0}},"type":"object","required":["predecessor_id","successor_id"],"title":"AddedRelationship","description":"A dependency added in the as-built schedule."},"AnalysisSummary":{"properties":{"status_date":{"type":"string","title":"Status Date","default":""},"analysis_horizon_days":{"type":"integer","title":"Analysis Horizon Days","default":0},"day_type":{"type":"string","title":"Day Type","default":"calendar"},"bands_analyzed":{"type":"integer","title":"Bands Analyzed","default":0},"total_tasks_in_horizon":{"type":"integer","title":"Total Tasks In Horizon","default":0},"tasks_at_risk":{"type":"integer","title":"Tasks At Risk","default":0},"overall_readiness_score":{"type":"number","title":"Overall Readiness Score","default":100.0}},"type":"object","title":"AnalysisSummary","description":"High-level summary of planning horizon analysis."},"ApprovalDimensionScore":{"properties":{"score":{"type":"number","title":"Score","default":100.0},"status":{"type":"string","title":"Status","default":"not_applicable"},"issues":{"items":{"$ref":"#/components/schemas/ReadinessIssue"},"type":"array","title":"Issues"}},"type":"object","title":"ApprovalDimensionScore","description":"Approval status readiness dimension result."},"AsBuiltScheduleInput":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"}},"type":"object","required":["tasks"],"title":"AsBuiltScheduleInput","description":"As-built (actual execution) schedule."},"AsPlannedScheduleInput":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"}},"type":"object","required":["tasks"],"title":"AsPlannedScheduleInput","description":"As-planned (original baseline) schedule."},"AsPlannedVsAsBuiltData":{"properties":{"summary":{"$ref":"#/components/schemas/AsPlannedVsAsBuiltSummary"},"task_comparisons":{"items":{"$ref":"#/components/schemas/TaskComparison"},"type":"array","title":"Task Comparisons"},"unmatched_planned_tasks":{"items":{"$ref":"#/components/schemas/UnmatchedPlannedTask"},"type":"array","title":"Unmatched Planned Tasks"},"unmatched_built_tasks":{"items":{"$ref":"#/components/schemas/UnmatchedBuiltTask"},"type":"array","title":"Unmatched Built Tasks"},"logic_diff":{"anyOf":[{"$ref":"#/components/schemas/LogicDiff"},{"type":"null"}]},"critical_path_overlay":{"anyOf":[{"$ref":"#/components/schemas/CriticalPathOverlay"},{"type":"null"}]},"resource_diff":{"anyOf":[{"$ref":"#/components/schemas/ResourceDiff"},{"type":"null"}]},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","title":"AsPlannedVsAsBuiltData","description":"Data payload for POST /api/v1/forensics/as-planned-vs-as-built."},"AsPlannedVsAsBuiltOptions":{"properties":{"include_logic_diff":{"type":"boolean","title":"Include Logic Diff","default":false},"include_critical_path_overlay":{"type":"boolean","title":"Include Critical Path Overlay","default":true},"include_resource_diff":{"type":"boolean","title":"Include Resource Diff","default":false},"match_strategy":{"type":"string","enum":["exact_id","fuzzy_name","wbs"],"title":"Match Strategy","default":"exact_id"},"fuzzy_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Fuzzy Threshold","default":0.8},"min_variance_days":{"type":"integer","minimum":0.0,"title":"Min Variance Days","default":1},"exclude_task_types":{"items":{"type":"string"},"type":"array","title":"Exclude Task Types"},"methodology":{"type":"string","enum":["direct","collapsed_as_built"],"title":"Methodology","default":"direct"}},"type":"object","title":"AsPlannedVsAsBuiltOptions","description":"Options for as-planned vs. as-built analysis."},"AsPlannedVsAsBuiltRequest":{"properties":{"as_planned":{"$ref":"#/components/schemas/AsPlannedScheduleInput"},"as_built":{"$ref":"#/components/schemas/AsBuiltScheduleInput"},"options":{"$ref":"#/components/schemas/AsPlannedVsAsBuiltOptions"}},"type":"object","required":["as_planned","as_built"],"title":"AsPlannedVsAsBuiltRequest","description":"Request body for POST /api/v1/forensics/as-planned-vs-as-built."},"AsPlannedVsAsBuiltSummary":{"properties":{"as_planned_task_count":{"type":"integer","title":"As Planned Task Count","default":0},"as_built_task_count":{"type":"integer","title":"As Built Task Count","default":0},"matched_tasks":{"type":"integer","title":"Matched Tasks","default":0},"unmatched_planned_tasks":{"type":"integer","title":"Unmatched Planned Tasks","default":0},"unmatched_built_tasks":{"type":"integer","title":"Unmatched Built Tasks","default":0},"on_time_completion_rate":{"type":"number","title":"On Time Completion Rate","default":0.0},"avg_start_variance_days":{"type":"number","title":"Avg Start Variance Days","default":0.0},"avg_finish_variance_days":{"type":"number","title":"Avg Finish Variance Days","default":0.0},"avg_duration_variance_days":{"type":"number","title":"Avg Duration Variance Days","default":0.0},"total_project_slippage_days":{"type":"integer","title":"Total Project Slippage Days","default":0},"critical_path_overlap_pct":{"type":"number","title":"Critical Path Overlap Pct","default":0.0},"loe_excluded_count":{"type":"integer","title":"Loe Excluded Count","default":0}},"type":"object","title":"AsPlannedVsAsBuiltSummary","description":"High-level comparison statistics."},"AutoDetected":{"properties":{"start_task_ids":{"items":{"type":"string"},"type":"array","title":"Start Task Ids"},"finish_task_ids":{"items":{"type":"string"},"type":"array","title":"Finish Task Ids"},"working_hours_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Working Hours Per Day"}},"type":"object","title":"AutoDetected"},"BaselineCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"BaselineCategoryResult","description":"Result for baseline change category."},"BaselineChartData":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"},"total_variance":{"items":{"type":"number"},"type":"array","title":"Total Variance"},"bei_values":{"items":{"type":"number"},"type":"array","title":"Bei Values"},"spi_values":{"items":{"type":"number"},"type":"array","title":"Spi Values"},"cp_variance":{"items":{"type":"number"},"type":"array","title":"Cp Variance"}},"type":"object","title":"BaselineChartData","description":"Pre-aggregated time-series arrays for dashboard charts."},"BaselineCompareCurrentSchedule":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"status_date":{"type":"string","title":"Status Date"}},"type":"object","required":["tasks","status_date"],"title":"BaselineCompareCurrentSchedule","description":"Current schedule snapshot for baseline comparison."},"BaselineCompareData":{"properties":{"summary":{"$ref":"#/components/schemas/BaselineCompareSummary"},"performance_indicators":{"$ref":"#/components/schemas/BaselinePerformanceIndicators"},"task_variances":{"items":{"$ref":"#/components/schemas/TaskVarianceRecord"},"type":"array","title":"Task Variances"},"findings":{"items":{"$ref":"#/components/schemas/VarianceFinding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/BaselineRecommendation"},"type":"array","title":"Recommendations"},"variance_trends":{"anyOf":[{"$ref":"#/components/schemas/VarianceTrends"},{"type":"null"}]},"evms_trends":{"anyOf":[{"$ref":"#/components/schemas/EVMSTrends"},{"type":"null"}]},"forecast_trends":{"anyOf":[{"$ref":"#/components/schemas/ForecastTrends"},{"type":"null"}]},"logic_changes":{"anyOf":[{"$ref":"#/components/schemas/LogicChanges"},{"type":"null"}]},"logic_audit_summary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Logic Audit Summary"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","title":"BaselineCompareData","description":"Data payload for POST /api/v1/forensics/baseline-compare."},"BaselineCompareHistorySnapshot":{"properties":{"snapshot_date":{"type":"string","title":"Snapshot Date"},"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"planned_value_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Planned Value Total"},"earned_value_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Earned Value Total"},"actual_cost_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Cost Total"},"budget_at_completion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget At Completion"}},"type":"object","required":["snapshot_date","tasks"],"title":"BaselineCompareHistorySnapshot","description":"One historical schedule snapshot for trend analysis."},"BaselineCompareOptions":{"properties":{"match_strategy":{"type":"string","enum":["id","id_and_wbs","wbs_hierarchy","fuzzy_id"],"title":"Match Strategy","default":"id"},"fuzzy_match_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Fuzzy Match Threshold","default":0.85},"variance_threshold_days":{"type":"integer","minimum":0.0,"title":"Variance Threshold Days","default":5},"include_task_variances":{"type":"boolean","title":"Include Task Variances","default":true},"include_critical_path_only":{"type":"boolean","title":"Include Critical Path Only","default":false},"include_logic_changes":{"type":"boolean","title":"Include Logic Changes","default":false},"include_oos_impact":{"type":"boolean","title":"Include Oos Impact","default":false},"include_trends":{"type":"boolean","title":"Include Trends","default":false},"trend_analysis_periods":{"type":"integer","maximum":12.0,"minimum":2.0,"title":"Trend Analysis Periods","default":4},"include_evms_trends":{"type":"boolean","title":"Include Evms Trends","default":false},"eac_method":{"type":"string","enum":["cpi","spi","composite","weighted"],"title":"Eac Method","default":"cpi"},"include_forecast_trends":{"type":"boolean","title":"Include Forecast Trends","default":false},"variance_acceleration_threshold":{"type":"number","minimum":0.0,"title":"Variance Acceleration Threshold","default":0.1},"include_chart_data":{"type":"boolean","title":"Include Chart Data","default":false}},"type":"object","title":"BaselineCompareOptions","description":"Options controlling baseline compare analysis."},"BaselineCompareRequest":{"properties":{"current_schedule":{"$ref":"#/components/schemas/BaselineCompareCurrentSchedule"},"baseline_schedule":{"$ref":"#/components/schemas/BaselineScheduleInput"},"schedule_history":{"items":{"$ref":"#/components/schemas/BaselineCompareHistorySnapshot"},"type":"array","title":"Schedule History"},"options":{"$ref":"#/components/schemas/BaselineCompareOptions"}},"type":"object","required":["current_schedule","baseline_schedule"],"title":"BaselineCompareRequest","description":"Request body for POST /api/v1/forensics/baseline-compare."},"BaselineCompareSummary":{"properties":{"comparison_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparison Date"},"baseline_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Date"},"total_tasks":{"type":"integer","title":"Total Tasks","default":0},"matched_tasks":{"type":"integer","title":"Matched Tasks","default":0},"unmatched_current_tasks":{"type":"integer","title":"Unmatched Current Tasks","default":0},"unmatched_baseline_tasks":{"type":"integer","title":"Unmatched Baseline Tasks","default":0},"tasks_with_variance":{"type":"integer","title":"Tasks With Variance","default":0},"total_variance_days":{"type":"number","title":"Total Variance Days","default":0.0},"critical_path_variance_days":{"type":"number","title":"Critical Path Variance Days","default":0.0}},"type":"object","title":"BaselineCompareSummary","description":"High-level match and variance counts."},"BaselineDriftSubMetric":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"active":{"type":"boolean","title":"Active"},"summary":{"type":"string","title":"Summary","default":""},"avg_finish_variance_days":{"type":"number","title":"Avg Finish Variance Days","default":0.0},"bei":{"type":"number","title":"Bei","default":1.0},"variance_acceleration":{"type":"boolean","title":"Variance Acceleration","default":false},"critical_path_delay_days":{"type":"number","title":"Critical Path Delay Days","default":0.0}},"type":"object","required":["score","weight","active"],"title":"BaselineDriftSubMetric","description":"Baseline Drift Risk sub-metric result."},"BaselinePerformanceIndicators":{"properties":{"bei":{"type":"number","title":"Bei","default":1.0},"critical_path_bei":{"type":"number","title":"Critical Path Bei","default":1.0},"spi_schedule":{"type":"number","title":"Spi Schedule","default":1.0},"variance_severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Variance Severity","default":"low"},"on_track_percentage":{"type":"number","title":"On Track Percentage","default":100.0},"oos_penalty":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Oos Penalty"}},"type":"object","title":"BaselinePerformanceIndicators","description":"BEI, SPI, and severity classification."},"BaselineRecommendation":{"properties":{"priority":{"type":"string","enum":["critical","high","medium","low"],"title":"Priority"},"category":{"type":"string","enum":["schedule_recovery","baseline_revision","resource_reallocation","risk_mitigation"],"title":"Category"},"description":{"type":"string","title":"Description"},"affected_tasks":{"items":{"type":"string"},"type":"array","title":"Affected Tasks"}},"type":"object","required":["priority","category","description"],"title":"BaselineRecommendation","description":"Actionable recommendation from variance analysis."},"BaselineScheduleInput":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"baseline_date":{"type":"string","title":"Baseline Date"}},"type":"object","required":["tasks","baseline_date"],"title":"BaselineScheduleInput","description":"Approved baseline schedule for comparison."},"BellatorResponse_AsPlannedVsAsBuiltData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/AsPlannedVsAsBuiltData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[AsPlannedVsAsBuiltData]"},"BellatorResponse_BaselineCompareData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/BaselineCompareData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[BaselineCompareData]"},"BellatorResponse_CPMData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/CPMData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[CPMData]"},"BellatorResponse_ChangeTrackingData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ChangeTrackingData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ChangeTrackingData]"},"BellatorResponse_DCMA14PointData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/DCMA14PointData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[DCMA14PointData]"},"BellatorResponse_DCMADECMData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/DCMADECMData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[DCMADECMData]"},"BellatorResponse_DelayAnalysisData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/DelayAnalysisData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[DelayAnalysisData]"},"BellatorResponse_HealthScoreData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/HealthScoreData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[HealthScoreData]"},"BellatorResponse_ImportData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ImportData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ImportData]"},"BellatorResponse_LogicAuditData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/LogicAuditData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[LogicAuditData]"},"BellatorResponse_PlanningHorizonData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/PlanningHorizonData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[PlanningHorizonData]"},"BellatorResponse_ProgressAuditData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProgressAuditData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ProgressAuditData]"},"BellatorResponse_ResourceAnalysisData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ResourceAnalysisData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ResourceAnalysisData]"},"BellatorResponse_ScheduleRiskIndexData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScheduleRiskIndexData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ScheduleRiskIndexData]"},"BellatorResponse_ValidationData_":{"properties":{"status":{"$ref":"#/components/schemas/ResponseStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"grade":{"anyOf":[{"$ref":"#/components/schemas/Grade"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"breakdown":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Breakdown"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"data":{"anyOf":[{"$ref":"#/components/schemas/ValidationData"},{"type":"null"}]},"simulation":{"anyOf":[{"$ref":"#/components/schemas/SimulationEnvelope"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/ResponseMetadata"}},"type":"object","required":["status","metadata"],"title":"BellatorResponse[ValidationData]"},"CPMData":{"properties":{"critical_path":{"items":{"type":"string"},"type":"array","title":"Critical Path","description":"Task IDs on the critical path"},"project_duration":{"type":"number","title":"Project Duration","description":"Total project duration in days"},"critical_path_length":{"type":"number","title":"Critical Path Length","description":"Critical path length in days"},"task_count":{"type":"integer","title":"Task Count","description":"Number of tasks"},"dependency_count":{"type":"integer","title":"Dependency Count","description":"Number of dependencies"},"relationship_type_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Relationship Type Distribution","description":"Count of dependencies by relationship type (effective view)"},"relationship_filter_applied":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Relationship Filter Applied","description":"Relationship-type filter used to aggregate dependency view"},"tasks":{"additionalProperties":{"$ref":"#/components/schemas/TaskTiming"},"type":"object","title":"Tasks","description":"Task timing information"},"network_details":{"anyOf":[{"$ref":"#/components/schemas/NetworkDetails"},{"type":"null"}],"description":"Network structure details"},"processing_metadata":{"$ref":"#/components/schemas/app__api__v1__schedule_analysis__cpm__ProcessingMetadata","description":"Processing metadata"}},"type":"object","required":["critical_path","project_duration","critical_path_length","task_count","dependency_count","tasks","processing_metadata"],"title":"CPMData","description":"Data payload for CPM calculation response.\n\nPer CPM API Specification v1.0.0:\n- critical_path: Ordered list of task IDs on the critical path\n- project_duration: Total project duration in days\n- critical_path_length: Length of critical path in days (equals project_duration)\n- task_count: Number of tasks in the schedule\n- dependency_count: Total number of dependencies\n- tasks: Per-task timing information\n- network_details: Optional network structure details\n- processing_metadata: Processing time and algorithm version","example":{"critical_path":["T1","T3","T4"],"critical_path_length":14.0,"dependency_count":4,"network_details":{"dependency_count_filtered":4,"dependency_count_total":4,"finish_tasks":["T4"],"has_negative_float":false,"relationship_type_distribution":{"FF":1,"FS":2,"SS":1},"relationship_types":["FF","FS","SS"],"start_tasks":["T1"]},"processing_metadata":{"algorithm_version":"v0.1.0","processing_time_ms":42.5},"project_duration":14.0,"relationship_type_distribution":{"FF":1,"FS":2,"SS":1},"task_count":4,"tasks":{"T1":{"criticality_index":1.0,"early_finish":5.0,"early_start":0.0,"free_float":0.0,"is_critical":true,"late_finish":5.0,"late_start":0.0,"total_float":0.0}}}},"CPMOptions":{"properties":{"include_network_details":{"type":"boolean","title":"Include Network Details","description":"Include network details (start/finish tasks, relationship types)","default":false},"relationship_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Relationship Types","description":"Optional relationship-type filter for network aggregation and details (FS, SS, FF, SF)."}},"type":"object","title":"CPMOptions","description":"Options for CPM calculation."},"CPMRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","maxItems":10000,"minItems":1,"title":"Tasks","description":"List of tasks in the schedule"},"options":{"$ref":"#/components/schemas/CPMOptions","description":"CPM calculation options"}},"type":"object","required":["tasks"],"title":"CPMRequest","description":"Request model for CPM calculation.","example":{"options":{"include_network_details":true},"tasks":[{"duration_days":5,"id":"T1","predecessors":[]},{"duration_days":3,"id":"T2","predecessors":["T1"]},{"duration_days":7,"id":"T3","predecessors":["T1"]},{"duration_days":2,"id":"T4","predecessors":["T2","T3"]}]}},"CPResourceAssignment":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"resource_name":{"type":"string","title":"Resource Name"},"early_start":{"type":"string","title":"Early Start"},"early_finish":{"type":"string","title":"Early Finish"},"duration_days":{"type":"number","title":"Duration Days"},"over_allocated_during_task":{"type":"boolean","title":"Over Allocated During Task","default":false}},"type":"object","required":["task_id","task_name","resource_name","early_start","early_finish","duration_days"],"title":"CPResourceAssignment","description":"A task on the critical path with its resource assignment."},"CalendarInfo":{"properties":{"working_hours_per_day":{"type":"number","title":"Working Hours Per Day"},"working_days_per_week":{"type":"number","title":"Working Days Per Week"},"holidays_detected":{"type":"integer","title":"Holidays Detected","default":0}},"type":"object","required":["working_hours_per_day","working_days_per_week"],"title":"CalendarInfo"},"CategorizedDelays":{"properties":{"owner":{"type":"number","title":"Owner","default":0.0},"contractor":{"type":"number","title":"Contractor","default":0.0},"design":{"type":"number","title":"Design","default":0.0},"procurement":{"type":"number","title":"Procurement","default":0.0},"weather":{"type":"number","title":"Weather","default":0.0},"force_majeure":{"type":"number","title":"Force Majeure","default":0.0},"concurrent":{"type":"number","title":"Concurrent","default":0.0}},"type":"object","title":"CategorizedDelays","description":"Delay days aggregated by responsible party."},"CausalChain":{"properties":{"root_task_id":{"type":"string","title":"Root Task Id"},"impacted_milestone":{"type":"string","title":"Impacted Milestone"},"delay_propagation_path":{"items":{"type":"string"},"type":"array","title":"Delay Propagation Path"},"cumulative_impact_days":{"type":"number","title":"Cumulative Impact Days","default":0.0},"chain_confidence":{"type":"number","title":"Chain Confidence","default":1.0},"concurrency_score":{"type":"number","title":"Concurrency Score","default":0.0}},"type":"object","required":["root_task_id","impacted_milestone"],"title":"CausalChain","description":"Delay propagation chain from a root task."},"ChangeImpactAnalysis":{"properties":{"total_tasks_affected":{"type":"integer","title":"Total Tasks Affected","default":0},"critical_path_affected":{"type":"boolean","title":"Critical Path Affected","default":false},"schedule_impact_days":{"type":"number","title":"Schedule Impact Days","default":0.0},"cost_impact_estimate":{"type":"string","enum":["low","medium","high","critical"],"title":"Cost Impact Estimate","default":"low"},"downstream_effects":{"items":{"$ref":"#/components/schemas/DownstreamEffect"},"type":"array","title":"Downstream Effects"}},"type":"object","title":"ChangeImpactAnalysis","description":"Impact analysis of detected changes on the schedule."},"ChangeTrackingCurrentSchedule":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Current task array"},"status_date":{"type":"string","title":"Status Date","description":"Current schedule status date (ISO 8601)"}},"type":"object","required":["tasks","status_date"],"title":"ChangeTrackingCurrentSchedule","description":"The current schedule submitted for change tracking comparison."},"ChangeTrackingData":{"properties":{"comparison_summary":{"$ref":"#/components/schemas/ComparisonSummary"},"changes_by_category":{"$ref":"#/components/schemas/ChangesByCategory"},"impact_analysis":{"$ref":"#/components/schemas/ChangeImpactAnalysis"},"trends":{"$ref":"#/components/schemas/ChangeTrends"},"compliance_tags":{"items":{"type":"string"},"type":"array","title":"Compliance Tags"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","required":["comparison_summary","changes_by_category"],"title":"ChangeTrackingData","description":"Data payload for POST /api/v1/forensics/change-tracking."},"ChangeTrackingMaterialityThresholds":{"properties":{"date_change_days":{"type":"integer","minimum":1.0,"title":"Date Change Days","description":"Min days for a date change to be material","default":1},"progress_change_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Progress Change Pct","description":"Min % decrease to flag","default":5.0}},"type":"object","title":"ChangeTrackingMaterialityThresholds","description":"Overridable materiality thresholds for change detection."},"ChangeTrackingOptions":{"properties":{"comparison_mode":{"type":"string","enum":["latest","all_periods","specific_dates"],"title":"Comparison Mode","default":"all_periods"},"change_categories":{"items":{"type":"string"},"type":"array","title":"Change Categories","description":"Categories: baseline, actual, forecast, logic, resource, progress, all"},"include_impact_analysis":{"type":"boolean","title":"Include Impact Analysis","default":true},"include_trends":{"type":"boolean","title":"Include Trends","default":true},"include_details":{"type":"boolean","title":"Include Details","default":false},"materiality_thresholds":{"$ref":"#/components/schemas/ChangeTrackingMaterialityThresholds"}},"type":"object","title":"ChangeTrackingOptions","description":"Options controlling change tracking behaviour."},"ChangeTrackingRequest":{"properties":{"current_schedule":{"$ref":"#/components/schemas/ChangeTrackingCurrentSchedule"},"schedule_history":{"items":{"$ref":"#/components/schemas/ChangeTrackingSnapshot"},"type":"array","minItems":1,"title":"Schedule History","description":"Historical snapshots (min 1 required)"},"options":{"$ref":"#/components/schemas/ChangeTrackingOptions"}},"type":"object","required":["current_schedule","schedule_history"],"title":"ChangeTrackingRequest","description":"Request for POST /api/v1/forensics/change-tracking."},"ChangeTrackingSnapshot":{"properties":{"snapshot_date":{"type":"string","title":"Snapshot Date","description":"Snapshot date (ISO 8601 YYYY-MM-DD)"},"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Task array at snapshot time"}},"type":"object","required":["snapshot_date","tasks"],"title":"ChangeTrackingSnapshot","description":"A historical schedule snapshot for change tracking."},"ChangeTrends":{"properties":{"identified_patterns":{"items":{"$ref":"#/components/schemas/TrendPattern"},"type":"array","title":"Identified Patterns"},"risk_indicators":{"items":{"$ref":"#/components/schemas/RiskIndicator"},"type":"array","title":"Risk Indicators"}},"type":"object","title":"ChangeTrends","description":"Systemic trend patterns and risk indicators."},"ChangesByCategory":{"properties":{"baseline_changes":{"$ref":"#/components/schemas/BaselineCategoryResult"},"actual_changes":{"$ref":"#/components/schemas/ActualCategoryResult"},"forecast_changes":{"$ref":"#/components/schemas/ForecastCategoryResult"},"logic_changes":{"$ref":"#/components/schemas/LogicCategoryResult"},"resource_changes":{"$ref":"#/components/schemas/ResourceCategoryResult"},"progress_changes":{"$ref":"#/components/schemas/ProgressCategoryResult"}},"type":"object","title":"ChangesByCategory","description":"All six change categories bundled together."},"CheckoutReconcileRequest":{"properties":{"session_id":{"type":"string","minLength":1,"title":"Session Id","description":"Stripe Checkout Session ID"}},"type":"object","required":["session_id"],"title":"CheckoutReconcileRequest","description":"Reconcile a completed checkout session into local subscription state."},"CheckoutReconcileResponse":{"properties":{"reconciled":{"type":"boolean","title":"Reconciled"},"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id"}},"type":"object","required":["reconciled","tier","status"],"title":"CheckoutReconcileResponse","description":"Response from checkout reconciliation."},"CheckoutSessionResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url","description":"Stripe-hosted checkout URL — redirect user here"},"session_id":{"type":"string","title":"Session Id","description":"Stripe Checkout Session ID"}},"type":"object","required":["checkout_url","session_id"],"title":"CheckoutSessionResponse","description":"Stripe Checkout Session response.\n\nAttributes:\n    checkout_url: Stripe-hosted checkout URL; redirect user here\n    session_id: Stripe session ID for reference"},"ComparisonSummary":{"properties":{"current_status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status Date"},"snapshots_analyzed":{"type":"integer","title":"Snapshots Analyzed","default":0},"snapshot_dates":{"items":{"type":"string"},"type":"array","title":"Snapshot Dates"},"comparison_mode":{"type":"string","title":"Comparison Mode","default":"all_periods"},"total_changes_detected":{"type":"integer","title":"Total Changes Detected","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"immaterial_changes_filtered":{"type":"integer","title":"Immaterial Changes Filtered","default":0}},"type":"object","title":"ComparisonSummary","description":"High-level summary of the comparison operation."},"ConcurrentOverlap":{"properties":{"overlapping_task_id":{"type":"string","title":"Overlapping Task Id"},"shared_days":{"type":"integer","title":"Shared Days"},"concurrency_ratio":{"type":"number","title":"Concurrency Ratio"}},"type":"object","required":["overlapping_task_id","shared_days","concurrency_ratio"],"title":"ConcurrentOverlap","description":"Concurrent delay overlap details."},"ContactSubmissionRequest":{"properties":{"submission_type":{"type":"string","pattern":"^(general_inquiry|sales|feedback|waitlist|newsletter)$","title":"Submission Type","description":"Type of submission: general_inquiry, sales, feedback, waitlist, newsletter"},"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Submitter's name"},"email":{"type":"string","maxLength":255,"minLength":5,"title":"Email","description":"Submitter's email address"},"company":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company","description":"Submitter's company"},"message":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Message","description":"Submission message"},"waitlist_types":{"items":{"type":"string"},"type":"array","title":"Waitlist Types","description":"Waitlist types to join (starter_tier, professional_tier)"},"source_page":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source Page","description":"Page where form was submitted"},"recaptcha_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recaptcha Token","description":"reCAPTCHA v3 token for spam prevention"}},"type":"object","required":["submission_type","email"],"title":"ContactSubmissionRequest","description":"Request schema for contact form submission.\n\nSupports multiple submission types:\n- general_inquiry: General questions about products\n- sales: Enterprise/custom solution inquiries\n- feedback: User feedback from playground (authenticated)\n- waitlist: Join waitlist for future tiers\n- newsletter: Blog / marketing email list signup (consent required upstream)"},"ContactSubmissionResponse":{"properties":{"submission_id":{"type":"string","title":"Submission Id","description":"Unique submission ID for tracking"},"status":{"type":"string","title":"Status","description":"Submission status","default":"success"},"message":{"type":"string","title":"Message","description":"Success message confirming submission was received"},"expected_response_time_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Response Time Hours","description":"Deprecated optional field. Contact submissions do not promise a response-time SLA."}},"type":"object","required":["submission_id","message"],"title":"ContactSubmissionResponse","description":"Response schema for successful contact form submission."},"CreateAPIKeyRequest":{"properties":{"tier":{"$ref":"#/components/schemas/APITier","description":"API tier (default: free)","default":"free"}},"type":"object","title":"CreateAPIKeyRequest","description":"Request to create a new API key."},"CriticalPathOverlay":{"properties":{"planned_critical_path":{"items":{"type":"string"},"type":"array","title":"Planned Critical Path"},"actual_critical_path":{"items":{"type":"string"},"type":"array","title":"Actual Critical Path"},"tasks_maintained_on_cp":{"items":{"type":"string"},"type":"array","title":"Tasks Maintained On Cp"},"tasks_gained_criticality":{"items":{"type":"string"},"type":"array","title":"Tasks Gained Criticality"},"tasks_lost_criticality":{"items":{"type":"string"},"type":"array","title":"Tasks Lost Criticality"},"path_divergence_score":{"type":"number","title":"Path Divergence Score","default":0.0}},"type":"object","title":"CriticalPathOverlay","description":"Comparison of planned vs. actual critical paths."},"CriticalPathResources":{"properties":{"resource_names":{"items":{"type":"string"},"type":"array","title":"Resource Names"},"critical_path_task_assignments":{"items":{"$ref":"#/components/schemas/CPResourceAssignment"},"type":"array","title":"Critical Path Task Assignments"},"resources_over_allocated_on_cp":{"items":{"type":"string"},"type":"array","title":"Resources Over Allocated On Cp"}},"type":"object","title":"CriticalPathResources","description":"Resources that appear on the critical path."},"CrossBandInsights":{"properties":{"readiness_trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readiness Trend"},"trend_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend Description"},"systemic_issues":{"items":{"$ref":"#/components/schemas/SystemicIssue"},"type":"array","title":"Systemic Issues"}},"type":"object","title":"CrossBandInsights","description":"Trends and systemic issues across all horizon bands."},"CumulativeCurveBucket":{"properties":{"date":{"type":"string","title":"Date"},"cumulative_task_days":{"type":"number","title":"Cumulative Task Days"}},"type":"object","required":["date","cumulative_task_days"],"title":"CumulativeCurveBucket","description":"One point on a cumulative resource demand curve."},"DCMA14PointCustomThresholds":{"properties":{"check_1_logic_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 1 Logic Max Pct"},"check_2_leads_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 2 Leads Max Pct"},"check_3_lags_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 3 Lags Max Pct"},"check_4_fs_min_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 4 Fs Min Pct"},"check_5_constraints_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 5 Constraints Max Pct"},"check_6_high_float_days":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Check 6 High Float Days"},"check_6_high_float_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 6 High Float Max Pct"},"check_7_negative_float_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 7 Negative Float Max Pct"},"check_8_high_duration_days":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Check 8 High Duration Days"},"check_8_high_duration_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 8 High Duration Max Pct"},"check_10_unresourced_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 10 Unresourced Max Pct"},"check_11_missed_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 11 Missed Max Pct"},"check_13_cpli_min":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Check 13 Cpli Min"},"check_14_bei_min":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Check 14 Bei Min"}},"type":"object","title":"DCMA14PointCustomThresholds","description":"Custom threshold overrides for DCMA 14-Point checks."},"DCMA14PointData":{"properties":{"overall_status":{"type":"string","enum":["pass","warning","fail"],"title":"Overall Status"},"checks":{"items":{"$ref":"#/components/schemas/DCMACheckResult"},"type":"array","title":"Checks","description":"Results for all 14 checks."},"summary":{"$ref":"#/components/schemas/DCMA14PointSummary"},"threshold_metadata":{"$ref":"#/components/schemas/DCMAThresholdMetadata"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","description":"Prioritized remediation recommendations."},"compliance_tags":{"items":{"type":"string"},"type":"array","title":"Compliance Tags","description":"Applicable compliance standard tags."},"audit_metadata":{"additionalProperties":true,"type":"object","title":"Audit Metadata","description":"Analysis metadata (task count, options, etc.)"}},"type":"object","required":["overall_status","checks","summary"],"title":"DCMA14PointData","description":"Data payload for POST /api/v1/forensics/dcma-14-point."},"DCMA14PointOptions":{"properties":{"threshold_profile":{"type":"string","title":"Threshold Profile","description":"Threshold profile: 'dcma-pam-200.1' (default), 'dcma-strict', 'dcma-relaxed', 'gao-16-89g', 'aace-rp-92r-19', 'nasa-npr-7120', 'custom'.","default":"dcma-pam-200.1"},"custom_thresholds":{"anyOf":[{"$ref":"#/components/schemas/DCMA14PointCustomThresholds"},{"type":"null"}],"description":"Per-check threshold overrides (applied on top of selected profile)."},"include_details":{"type":"boolean","title":"Include Details","description":"Include violating task IDs and detailed evidence objects in each check result.","default":false}},"type":"object","title":"DCMA14PointOptions","description":"Request options for DCMA 14-Point assessment."},"DCMA14PointRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","minItems":2,"title":"Tasks","description":"Schedule tasks (minimum 2)."},"start_task_ids":{"items":{"type":"string"},"type":"array","title":"Start Task Ids","description":"Task IDs exempt from predecessor requirements (Check #1)."},"finish_task_ids":{"items":{"type":"string"},"type":"array","title":"Finish Task Ids","description":"Task IDs exempt from successor requirements (Check #1)."},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"Project data date (ISO 8601). Required for checks #9, #11, #14."},"target_finish_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Finish Date","description":"Target finish date (ISO 8601). Required for Check #13 (CPLI)."},"loe_task_ids":{"items":{"type":"string"},"type":"array","title":"Loe Task Ids","description":"Level-of-Effort task IDs — excluded from all checks."},"apportioned_effort_task_ids":{"items":{"type":"string"},"type":"array","title":"Apportioned Effort Task Ids","description":"Apportioned Effort task IDs — excluded from all checks."},"schedule_margin_task_ids":{"items":{"type":"string"},"type":"array","title":"Schedule Margin Task Ids","description":"Schedule margin task IDs — excluded from all checks."},"summary_task_ids":{"items":{"type":"string"},"type":"array","title":"Summary Task Ids","description":"Summary/rollup task IDs — excluded from all checks."},"planning_package_task_ids":{"items":{"type":"string"},"type":"array","title":"Planning Package Task Ids","description":"Planning package task IDs — excluded from Check #8 only."},"summary_level_pp_task_ids":{"items":{"type":"string"},"type":"array","title":"Summary Level Pp Task Ids","description":"Summary-level planning package IDs — excluded from Check #8."},"schedule_visibility_task_ids":{"items":{"type":"string"},"type":"array","title":"Schedule Visibility Task Ids","description":"Schedule Visibility Task IDs — excluded from checks #8, #10, #11, #14."},"options":{"$ref":"#/components/schemas/DCMA14PointOptions","description":"Assessment options."}},"type":"object","required":["tasks"],"title":"DCMA14PointRequest","description":"Request body for POST /api/v1/forensics/dcma-14-point."},"DCMA14PointSummary":{"properties":{"total_checks":{"type":"integer","minimum":0.0,"title":"Total Checks","default":14},"passed":{"type":"integer","minimum":0.0,"title":"Passed","default":0},"warnings":{"type":"integer","minimum":0.0,"title":"Warnings","default":0},"failed":{"type":"integer","minimum":0.0,"title":"Failed","default":0},"skipped":{"type":"integer","minimum":0.0,"title":"Skipped","default":0},"compliance_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Compliance Ratio","default":0.0}},"type":"object","title":"DCMA14PointSummary","description":"Summary of 14-point check outcomes."},"DCMACheckResult":{"properties":{"check_id":{"type":"integer","maximum":14.0,"minimum":1.0,"title":"Check Id"},"check_name":{"type":"string","title":"Check Name"},"status":{"type":"string","enum":["pass","warning","fail","skipped"],"title":"Status"},"measured_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Measured Value"},"threshold_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold Value"},"threshold_source":{"type":"string","title":"Threshold Source","default":"dcma-pam-200.1"},"threshold_overridden":{"type":"boolean","title":"Threshold Overridden","default":false},"pass_criteria":{"type":"string","title":"Pass Criteria","default":""},"violation_count":{"type":"integer","minimum":0.0,"title":"Violation Count","default":0},"total_items":{"type":"integer","minimum":0.0,"title":"Total Items","default":0},"percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentage"},"evidence":{"anyOf":[{"items":{},"type":"array"},{"additionalProperties":true,"type":"object"}],"title":"Evidence"},"message":{"type":"string","title":"Message","default":""}},"type":"object","required":["check_id","check_name","status"],"title":"DCMACheckResult","description":"Result for a single DCMA 14-Point check."},"DCMADECMCustomThresholds":{"properties":{"check_06A204b_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A204B Max Pct"},"check_06A205a_lags_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A205A Lags Max Pct"},"check_06A208a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A208A Max Pct"},"check_06A209a_constraints_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A209A Constraints Max Pct"},"check_06A210a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A210A Max Pct"},"check_06A212a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A212A Max Pct"},"check_06A504a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A504A Max Pct"},"check_06A504b_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A504B Max Pct"},"check_06A505a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A505A Max Pct"},"check_06A505b_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A505B Max Pct"},"check_06A506a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A506A Max Pct"},"check_06A506b_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A506B Max Pct"},"check_06A506c_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 06A506C Max Pct"},"check_08I101a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 08I101A Max Pct"},"check_10A303a_max_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Check 10A303A Max Pct"}},"type":"object","title":"DCMADECMCustomThresholds","description":"Custom threshold overrides for DCMA DECM checks."},"DCMADECMData":{"properties":{"scope_requested":{"type":"string","title":"Scope Requested","default":"schedule_only"},"scope_executed":{"type":"string","title":"Scope Executed","default":"schedule_only"},"overall_status":{"type":"string","enum":["pass","warning","fail"],"title":"Overall Status"},"checks_by_guideline":{"additionalProperties":{"$ref":"#/components/schemas/DECMGuidelineResult"},"type":"object","title":"Checks By Guideline"},"overall_summary":{"$ref":"#/components/schemas/DECMOverallSummary"},"threshold_metadata":{"$ref":"#/components/schemas/DECMThresholdMetadata"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","description":"Prioritized remediation recommendations."},"compliance_tags":{"items":{"type":"string"},"type":"array","title":"Compliance Tags","description":"Applicable compliance standard tags."},"audit_metadata":{"additionalProperties":true,"type":"object","title":"Audit Metadata","description":"Analysis metadata (task count, options, etc.)"}},"type":"object","required":["overall_status","checks_by_guideline","overall_summary"],"title":"DCMADECMData","description":"Data payload for POST /api/v1/forensics/dcma-decm."},"DCMADECMOptions":{"properties":{"threshold_profile":{"type":"string","title":"Threshold Profile","description":"Threshold profile: 'dcma-decm-default' (default), 'dcma-decm-strict'.","default":"dcma-decm-default"},"custom_thresholds":{"anyOf":[{"$ref":"#/components/schemas/DCMADECMCustomThresholds"},{"type":"null"}],"description":"Per-check threshold overrides (applied on top of selected profile)."},"include_details":{"type":"boolean","title":"Include Details","description":"Include violating task IDs and detailed evidence objects in each check result.","default":false}},"type":"object","title":"DCMADECMOptions","description":"Request options for DCMA DECM assessment."},"DCMADECMRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","minItems":2,"title":"Tasks","description":"Task list (minimum 2 tasks required)"},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"Project status/data date (ISO 8601). Required for checks 06A212a, 06A506a/b/c. Skipped with informative message if absent."},"target_finish_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Finish Date","description":"Contract/target finish date (ISO 8601). Reserved for future Tier 3 use."},"start_task_ids":{"items":{"type":"string"},"type":"array","title":"Start Task Ids","description":"Task IDs that legitimately have no predecessors (exempt from check 06A204b)."},"finish_task_ids":{"items":{"type":"string"},"type":"array","title":"Finish Task Ids","description":"Task IDs that legitimately have no successors (exempt from check 06A204b)."},"schedule_history":{"items":{"$ref":"#/components/schemas/ScheduleHistorySnapshot"},"type":"array","title":"Schedule History","description":"Optional historical snapshots for retroactive date change detection (checks 06A504a/b). Each snapshot requires snapshot_date + tasks."},"scope":{"type":"string","title":"Scope","description":"Scope of evaluation. 'schedule_only' (default) = 17 Tier 2 checks. 'guideline_6', 'full' = Tier 3 (not yet implemented).","default":"schedule_only"},"options":{"$ref":"#/components/schemas/DCMADECMOptions","description":"Assessment options."}},"type":"object","required":["tasks"],"title":"DCMADECMRequest","description":"Request body for POST /api/v1/forensics/dcma-decm."},"DCMADECMViolationRecord":{"properties":{"check_id":{"type":"string","title":"Check Id"},"task_id":{"type":"string","title":"Task Id"},"violation":{"type":"string","title":"Violation"},"original_date":{"type":"string","title":"Original Date"},"changed_date":{"type":"string","title":"Changed Date"},"snapshot_of_change":{"type":"string","title":"Snapshot Of Change"},"severity":{"type":"string","enum":["critical","high","medium","low"],"title":"Severity"},"suspicion_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Suspicion Details"}},"type":"object","required":["check_id","task_id","violation","original_date","changed_date","snapshot_of_change","severity"],"title":"DCMADECMViolationRecord","description":"A DCMA DECM 06A504a/b violation record."},"DCMAThresholdMetadata":{"properties":{"profile_used":{"type":"string","title":"Profile Used","default":"dcma-pam-200.1"},"overrides_applied":{"type":"integer","title":"Overrides Applied","default":0},"overridden_checks":{"items":{"type":"integer"},"type":"array","title":"Overridden Checks"},"custom_thresholds":{"additionalProperties":true,"type":"object","title":"Custom Thresholds"}},"type":"object","title":"DCMAThresholdMetadata","description":"Threshold configuration metadata."},"DECMCheckResult":{"properties":{"check_id":{"type":"string","title":"Check Id","description":"DECM check reference ID (e.g., '06A204b')"},"check_name":{"type":"string","title":"Check Name"},"category":{"type":"string","title":"Category","default":""},"status":{"type":"string","enum":["pass","warning","fail","skipped"],"title":"Status"},"measured_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Measured Value"},"threshold_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold Value"},"threshold_source":{"type":"string","title":"Threshold Source","default":"dcma-decm-default"},"threshold_overridden":{"type":"boolean","title":"Threshold Overridden","default":false},"pass_criteria":{"type":"string","title":"Pass Criteria","default":""},"violation_count":{"type":"integer","minimum":0.0,"title":"Violation Count","default":0},"total_items":{"type":"integer","minimum":0.0,"title":"Total Items","default":0},"percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentage"},"evidence":{"items":{},"type":"array","title":"Evidence"},"message":{"type":"string","title":"Message","default":""}},"type":"object","required":["check_id","check_name","status"],"title":"DECMCheckResult","description":"Result for a single DCMA DECM check."},"DECMGuidelineResult":{"properties":{"guideline_id":{"type":"integer","title":"Guideline Id"},"guideline_name":{"type":"string","title":"Guideline Name"},"checks":{"items":{"$ref":"#/components/schemas/DECMCheckResult"},"type":"array","title":"Checks"},"summary":{"$ref":"#/components/schemas/DECMGuidelineSummary"}},"type":"object","required":["guideline_id","guideline_name","checks","summary"],"title":"DECMGuidelineResult","description":"Results grouped by EVM Guideline."},"DECMGuidelineSummary":{"properties":{"total_checks":{"type":"integer","minimum":0.0,"title":"Total Checks","default":0},"passed":{"type":"integer","minimum":0.0,"title":"Passed","default":0},"warnings":{"type":"integer","minimum":0.0,"title":"Warnings","default":0},"failed":{"type":"integer","minimum":0.0,"title":"Failed","default":0},"skipped":{"type":"integer","minimum":0.0,"title":"Skipped","default":0},"compliance_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Compliance Ratio","default":0.0}},"type":"object","title":"DECMGuidelineSummary","description":"Summary of checks within a single EVM Guideline."},"DECMOverallSummary":{"properties":{"scope":{"type":"string","title":"Scope","default":"schedule_only"},"total_checks":{"type":"integer","minimum":0.0,"title":"Total Checks","default":0},"passed":{"type":"integer","minimum":0.0,"title":"Passed","default":0},"warnings":{"type":"integer","minimum":0.0,"title":"Warnings","default":0},"failed":{"type":"integer","minimum":0.0,"title":"Failed","default":0},"skipped":{"type":"integer","minimum":0.0,"title":"Skipped","default":0},"compliance_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Compliance Ratio","default":0.0},"guidelines_evaluated":{"items":{"type":"integer"},"type":"array","title":"Guidelines Evaluated"},"recommendation":{"type":"string","title":"Recommendation","default":""}},"type":"object","title":"DECMOverallSummary","description":"Overall summary across all evaluated guidelines."},"DECMThresholdMetadata":{"properties":{"profile_used":{"type":"string","title":"Profile Used","default":"dcma-decm-default"},"overrides_applied":{"type":"integer","title":"Overrides Applied","default":0},"overridden_checks":{"items":{"type":"string"},"type":"array","title":"Overridden Checks"},"custom_thresholds":{"additionalProperties":true,"type":"object","title":"Custom Thresholds"}},"type":"object","title":"DECMThresholdMetadata","description":"Threshold configuration metadata."},"DelayAnalysisData":{"properties":{"delay_summary":{"$ref":"#/components/schemas/DelaySummary"},"delay_drivers":{"items":{"$ref":"#/components/schemas/DelayDriver"},"type":"array","title":"Delay Drivers"},"causal_chains":{"items":{"$ref":"#/components/schemas/CausalChain"},"type":"array","title":"Causal Chains"},"float_analysis":{"$ref":"#/components/schemas/FloatAnalysis"},"recommendations":{"items":{"$ref":"#/components/schemas/DelayRecommendation"},"type":"array","title":"Recommendations"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","title":"DelayAnalysisData","description":"Data payload for POST /api/v1/forensics/delay-analysis."},"DelayAnalysisOptions":{"properties":{"min_impact_days":{"type":"integer","minimum":0.0,"title":"Min Impact Days","default":1},"include_causal_chains":{"type":"boolean","title":"Include Causal Chains","default":true},"include_float_consumption":{"type":"boolean","title":"Include Float Consumption","default":true},"confidence_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence Threshold","default":0.5},"methodology":{"type":"string","enum":["windows","contemporaneous","collapsed_as_built"],"title":"Methodology","default":"windows"},"include_concurrent":{"type":"boolean","title":"Include Concurrent","default":false},"include_delay_categories":{"type":"boolean","title":"Include Delay Categories","default":false},"use_half_step":{"type":"boolean","title":"Use Half Step","default":false}},"type":"object","title":"DelayAnalysisOptions","description":"Options for delay analysis."},"DelayAnalysisRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"status_date":{"type":"string","title":"Status Date"},"options":{"$ref":"#/components/schemas/DelayAnalysisOptions"}},"type":"object","required":["tasks","status_date"],"title":"DelayAnalysisRequest","description":"Request body for POST /api/v1/forensics/delay-analysis."},"DelayDriver":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"delay_days":{"type":"number","title":"Delay Days"},"variance_type":{"type":"string","enum":["start_delay","finish_delay","duration_overrun","compound_delay","concurrent_delay"],"title":"Variance Type"},"delay_category":{"type":"string","title":"Delay Category","default":""},"baseline_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Start"},"actual_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Start"},"baseline_finish":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Finish"},"actual_finish":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Finish"},"contribution_to_total":{"type":"number","title":"Contribution To Total","default":0.0},"on_critical_path":{"type":"boolean","title":"On Critical Path","default":false},"successors_impacted":{"type":"integer","title":"Successors Impacted","default":0},"causal_score":{"type":"number","title":"Causal Score","default":0.0},"confidence":{"type":"number","title":"Confidence","default":1.0},"concurrent_overlaps":{"items":{"$ref":"#/components/schemas/ConcurrentOverlap"},"type":"array","title":"Concurrent Overlaps"}},"type":"object","required":["task_id","task_name","delay_days","variance_type"],"title":"DelayDriver","description":"Per-task delay driver with attribution scores."},"DelayRecommendation":{"properties":{"priority":{"type":"string","enum":["critical","high","medium"],"title":"Priority"},"recommendation":{"type":"string","title":"Recommendation"},"expected_impact":{"type":"string","title":"Expected Impact"},"standards_citation":{"type":"string","title":"Standards Citation"}},"type":"object","required":["priority","recommendation","expected_impact","standards_citation"],"title":"DelayRecommendation","description":"Actionable delay mitigation recommendation."},"DelaySummary":{"properties":{"total_delay_days":{"type":"number","title":"Total Delay Days","default":0.0},"delayed_tasks_count":{"type":"integer","title":"Delayed Tasks Count","default":0},"critical_path_delay_days":{"type":"number","title":"Critical Path Delay Days","default":0.0},"float_consumed_days":{"type":"number","title":"Float Consumed Days","default":0.0},"schedule_performance_index":{"type":"number","title":"Schedule Performance Index","default":1.0},"categorized_delays":{"$ref":"#/components/schemas/CategorizedDelays"}},"type":"object","title":"DelaySummary","description":"Aggregate delay metrics."},"DependencyLink":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Predecessor task ID"},"relationship_type":{"$ref":"#/components/schemas/RelationshipType","description":"Relationship type (FS/SS/FF/SF)","default":"FS"},"lag_days":{"type":"number","title":"Lag Days","description":"Lag (positive) or lead (negative) in days","default":0.0},"is_external":{"type":"boolean","title":"Is External","description":"True if link to external project file","default":false},"external_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Path","description":"Path to external file if is_external=True"}},"type":"object","required":["task_id"],"title":"DependencyLink","description":"Rich dependency link with relationship type and lag/lead.\n\nSupports parsing from various scheduling tool formats including:\n- MS Project: \"10FS+5 d\", \"/path/file.mpp/10FS+5 d\"\n- Primavera P6: Similar format with XER encoding\n- Server-based: \"<ServerFile>10FS+5 d\"\n- Simple: \"10\" (defaults to FS with zero lag)\n\nExamples:\n    >>> DependencyLink(task_id=\"10\", relationship_type=\"FS\", lag_days=5.0)\n    >>> DependencyLink.from_string(\"10FS+5 d\")\n    >>> DependencyLink.from_string(\"15SS-2 d\")","examples":[{"is_external":false,"lag_days":5.0,"relationship_type":"FS","task_id":"10"},{"is_external":false,"lag_days":-2.0,"relationship_type":"SS","task_id":"15"},{"external_path":"/path/to/external.mpp","is_external":true,"lag_days":5.0,"relationship_type":"FS","task_id":"20"}]},"DownstreamEffect":{"properties":{"change_task_id":{"type":"string","title":"Change Task Id"},"affected_task_ids":{"items":{"type":"string"},"type":"array","title":"Affected Task Ids"},"impact_type":{"type":"string","enum":["schedule_slip","schedule_acceleration"],"title":"Impact Type"},"impact_days":{"type":"number","title":"Impact Days"}},"type":"object","required":["change_task_id","impact_type","impact_days"],"title":"DownstreamEffect","description":"Downstream schedule effect from a material change."},"DurationConversion":{"properties":{"source_unit":{"type":"string","title":"Source Unit"},"target_unit":{"type":"string","title":"Target Unit","default":"days"},"conversion_factor":{"type":"number","title":"Conversion Factor"}},"type":"object","required":["source_unit","conversion_factor"],"title":"DurationConversion"},"EACHistoryEntry":{"properties":{"period_date":{"type":"string","title":"Period Date"},"forecasted_completion":{"type":"string","title":"Forecasted Completion"},"variance_to_baseline_days":{"type":"integer","title":"Variance To Baseline Days","default":0}},"type":"object","required":["period_date","forecasted_completion"],"title":"EACHistoryEntry","description":"Forecasted completion for one period."},"EACStability":{"properties":{"variance_range_days":{"type":"number","title":"Variance Range Days","default":0.0},"avg_monthly_change_days":{"type":"number","title":"Avg Monthly Change Days","default":0.0},"stability_rating":{"type":"string","enum":["stable","moderate","volatile"],"title":"Stability Rating","default":"stable"},"is_accelerating":{"type":"boolean","title":"Is Accelerating","default":false}},"type":"object","title":"EACStability","description":"EAC forecast stability assessment."},"EVMSChartData":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"},"spi_values":{"items":{"type":"number"},"type":"array","title":"Spi Values"},"cpi_values":{"items":{"type":"number"},"type":"array","title":"Cpi Values"},"eac_values":{"items":{"type":"number"},"type":"array","title":"Eac Values"}},"type":"object","title":"EVMSChartData","description":"Chart-ready EVMS time series."},"EVMSPerformanceSummary":{"properties":{"current_spi":{"type":"number","title":"Current Spi","default":1.0},"avg_spi":{"type":"number","title":"Avg Spi","default":1.0},"spi_trend":{"type":"string","enum":["improving","stable","declining"],"title":"Spi Trend","default":"stable"},"current_cpi":{"type":"number","title":"Current Cpi","default":1.0},"avg_cpi":{"type":"number","title":"Avg Cpi","default":1.0},"cpi_trend":{"type":"string","enum":["improving","stable","declining"],"title":"Cpi Trend","default":"stable"},"forecast_reliability":{"type":"string","enum":["high","medium","low"],"title":"Forecast Reliability","default":"medium"}},"type":"object","title":"EVMSPerformanceSummary","description":"Aggregate EVMS performance across periods."},"EVMSPeriod":{"properties":{"period_date":{"type":"string","title":"Period Date"},"sv":{"type":"number","title":"Sv","default":0.0},"cv":{"type":"number","title":"Cv","default":0.0},"spi":{"type":"number","title":"Spi","default":1.0},"cpi":{"type":"number","title":"Cpi","default":1.0},"tcpi":{"type":"number","title":"Tcpi","default":1.0},"eac_cpi":{"type":"number","title":"Eac Cpi","default":0.0},"eac_spi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eac Spi"},"eac_composite":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eac Composite"},"eac_weighted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eac Weighted"}},"type":"object","required":["period_date"],"title":"EVMSPeriod","description":"EVMS metrics for one period."},"EVMSTrends":{"properties":{"periods":{"items":{"$ref":"#/components/schemas/EVMSPeriod"},"type":"array","title":"Periods"},"performance_summary":{"$ref":"#/components/schemas/EVMSPerformanceSummary"},"chart_data":{"anyOf":[{"$ref":"#/components/schemas/EVMSChartData"},{"type":"null"}]}},"type":"object","title":"EVMSTrends","description":"EVMS trend data."},"EphemeralKeyResponse":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"The generated ephemeral API key"},"expires_at":{"type":"string","title":"Expires At","description":"ISO 8601 expiry timestamp"},"usage_limit":{"type":"integer","title":"Usage Limit","description":"Maximum number of API calls allowed"},"usage_remaining":{"type":"integer","title":"Usage Remaining","description":"Remaining API calls"},"type":{"type":"string","title":"Type","description":"Key type (ephemeral)"},"tier":{"type":"string","title":"Tier","description":"Issued tier. demo or free.","default":"demo"},"note":{"type":"string","title":"Note","description":"Usage instructions and upgrade information"}},"type":"object","required":["api_key","expires_at","usage_limit","usage_remaining","type","note"],"title":"EphemeralKeyResponse","description":"Response model for ephemeral key generation."},"Finding":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine-readable identifier e.g. DCMA_CHECK_8_HIGH_DURATION"},"severity":{"$ref":"#/components/schemas/FindingSeverity"},"title":{"type":"string","title":"Title","description":"Short human-readable label"},"description":{"type":"string","title":"Description","description":"Full explanation of the issue"},"standard":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard","description":"Standard citation e.g. 'DCMA PAM 200.1 Check #8'"},"affected_tasks":{"items":{"type":"string"},"type":"array","title":"Affected Tasks","description":"Task IDs implicated by this finding"},"metric_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Metric Value","description":"Observed measurement e.g. 60.0 days"},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold","description":"Threshold that was violated e.g. 44.0 days"}},"type":"object","required":["code","severity","title","description"],"title":"Finding","description":"A discrete, machine-readable issue identified during analysis.\n\n`code` values are stable across versions; consumers may key logic on them.\nPattern: {STANDARD}_{CHECK_ID}_{SHORT_DESCRIPTION} in SCREAMING_SNAKE_CASE."},"FindingSeverity":{"type":"string","enum":["critical","high","medium","low","info"],"title":"FindingSeverity","description":"Severity level for findings; reused as priority level for recommendations."},"FloatAnalysis":{"properties":{"float_consumed_by_task":{"additionalProperties":{"type":"number"},"type":"object","title":"Float Consumed By Task"},"near_critical_tasks":{"items":{"type":"string"},"type":"array","title":"Near Critical Tasks"},"float_erosion_rate":{"type":"number","title":"Float Erosion Rate","default":0.0}},"type":"object","title":"FloatAnalysis","description":"Float consumption and near-critical task tracking."},"FloatDimensionScore":{"properties":{"score":{"type":"number","title":"Score","default":100.0},"status":{"type":"string","title":"Status","default":"adequate"},"total_float_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Float Days"},"issues":{"items":{"$ref":"#/components/schemas/ReadinessIssue"},"type":"array","title":"Issues"}},"type":"object","title":"FloatDimensionScore","description":"Float adequacy readiness dimension result."},"FloatRiskSubMetric":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"active":{"type":"boolean","title":"Active"},"summary":{"type":"string","title":"Summary","default":""},"near_critical_task_count":{"type":"integer","title":"Near Critical Task Count","default":0},"negative_float_task_count":{"type":"integer","title":"Negative Float Task Count","default":0},"critical_path_density":{"type":"number","title":"Critical Path Density","default":0.0},"float_erosion_rate":{"type":"number","title":"Float Erosion Rate","default":0.0}},"type":"object","required":["score","weight","active"],"title":"FloatRiskSubMetric","description":"Float Risk sub-metric result."},"ForecastCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"trends":{"additionalProperties":{"type":"integer"},"type":"object","title":"Trends"},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"ForecastCategoryResult","description":"Result for forecast change category."},"ForecastChartData":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"},"eac_variance_days":{"items":{"type":"integer"},"type":"array","title":"Eac Variance Days"}},"type":"object","title":"ForecastChartData","description":"Chart-ready EAC variance time series."},"ForecastStabilityScore":{"properties":{"score":{"type":"number","title":"Score","default":100.0},"status":{"type":"string","title":"Status","default":"no_history"},"drift_days":{"type":"integer","title":"Drift Days","default":0},"drift_count":{"type":"integer","title":"Drift Count","default":0},"issues":{"items":{"$ref":"#/components/schemas/ReadinessIssue"},"type":"array","title":"Issues"}},"type":"object","title":"ForecastStabilityScore","description":"Forecast stability readiness dimension result."},"ForecastTrends":{"properties":{"eac_history":{"items":{"$ref":"#/components/schemas/EACHistoryEntry"},"type":"array","title":"Eac History"},"eac_stability":{"anyOf":[{"$ref":"#/components/schemas/EACStability"},{"type":"null"}]},"chart_data":{"anyOf":[{"$ref":"#/components/schemas/ForecastChartData"},{"type":"null"}]}},"type":"object","title":"ForecastTrends","description":"EAC forecast trend analysis."},"Grade":{"type":"string","enum":["A","B","C","D","F"],"title":"Grade","description":"Letter grade derived from a 0–100 score. Null on non-scoring endpoints."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthScoreData":{"properties":{"score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Score","description":"Overall health score (0-100)"},"grade":{"type":"string","title":"Grade","description":"Letter grade (A-F)"},"breakdown":{"additionalProperties":true,"type":"object","title":"Breakdown","description":"Detailed breakdown of score components"},"top_signals":{"items":{"type":"string"},"type":"array","title":"Top Signals","description":"Top risk signals or issues affecting the score"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Confidence level in the score (0-1)"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Detailed task-level diagnostics including recommendations per metric (when include_details=true)"},"ml_explanation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ml Explanation","description":"ML model explanations with SHAP values (when use_ml_scoring=true for Professional+ tiers)"}},"type":"object","required":["score","grade","confidence"],"title":"HealthScoreData","description":"Data payload for schedule health scoring response.","example":{"breakdown":{"criticality_score":90.0,"density_score":80.0,"float_erosion_score":85.0,"structural_score":95.0},"confidence":0.95,"details":{"cpm":{"critical_path_length":12,"project_duration_days":45},"criticality":{"critical_density_pct":45.0,"critical_task_count":45,"critical_tasks":[{"float_days":0,"id":"T1","name":"Foundation"}],"near_critical_tasks":[{"float_days":2.0,"id":"T2","name":"Framing"}],"recommendations":["HIGH PRIORITY: 45 of 100 tasks (45.0%) are on the critical path","[PMBOK 2.7.5.2] Review task dependencies for opportunities to create parallel work streams (fast-tracking)","[AACE RP 27R-03] Add time buffers (contingency reserves) before major milestones to protect against schedule delays"],"total_tasks":100},"float_erosion":{"average_float_days":2.3,"critical_ratio_pct":45.0,"max_float_days":8.5,"min_float_days":0.0,"recommendations":["[AACE RP 27R-03] Limited schedule flexibility with average schedule reserve of 2.3 days","[PMBOK 2.8.4.3] Implement proactive risk management to protect remaining float"],"tasks_with_low_float":[{"float_days":2.0,"id":"T2","name":"Framing"}]},"structural":{"dangling_tasks":[],"issues":[],"missing_logic_count":0,"recommendations":[]}},"grade":"B","score":85.5,"top_signals":["High critical path density (45%)","Low average float (2.3 days)"]}},"HistogramBucket":{"properties":{"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"demand_units":{"type":"number","title":"Demand Units"},"capacity_units":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capacity Units"},"utilization_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Utilization Pct"}},"type":"object","required":["period_start","period_end","demand_units"],"title":"HistogramBucket","description":"One histogram bucket for a resource demand curve."},"HorizonBandConfig":{"properties":{"name":{"type":"string","title":"Name"},"days":{"type":"integer","minimum":1.0,"title":"Days"}},"type":"object","required":["name","days"],"title":"HorizonBandConfig","description":"Definition of a single horizon band."},"HorizonBandResult":{"properties":{"band_name":{"type":"string","title":"Band Name"},"band_range_days":{"items":{"type":"integer"},"type":"array","title":"Band Range Days"},"band_start_date":{"type":"string","title":"Band Start Date"},"band_end_date":{"type":"string","title":"Band End Date"},"tasks_in_band":{"type":"integer","title":"Tasks In Band","default":0},"tasks_ready":{"type":"integer","title":"Tasks Ready","default":0},"tasks_at_risk":{"type":"integer","title":"Tasks At Risk","default":0},"band_readiness_score":{"type":"number","title":"Band Readiness Score","default":100.0},"readiness_breakdown":{"additionalProperties":{"type":"number"},"type":"object","title":"Readiness Breakdown"},"tasks":{"items":{"$ref":"#/components/schemas/HorizonTask"},"type":"array","title":"Tasks"},"top_risks":{"items":{"$ref":"#/components/schemas/TopRisk"},"type":"array","title":"Top Risks"}},"type":"object","required":["band_name","band_start_date","band_end_date"],"title":"HorizonBandResult","description":"Results for a single horizon band."},"HorizonRecommendation":{"properties":{"priority":{"type":"string","enum":["critical","high","medium","low"],"title":"Priority"},"category":{"type":"string","title":"Category"},"description":{"type":"string","title":"Description"},"action":{"type":"string","title":"Action"},"tasks_affected":{"items":{"type":"string"},"type":"array","title":"Tasks Affected"}},"type":"object","required":["priority","category","description","action"],"title":"HorizonRecommendation","description":"Actionable planning horizon recommendation."},"HorizonTask":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"forecast_start":{"type":"string","title":"Forecast Start"},"days_until_start":{"type":"integer","title":"Days Until Start"},"duration_days":{"type":"integer","title":"Duration Days"},"on_critical_path":{"type":"boolean","title":"On Critical Path","default":false},"readiness_score":{"type":"number","title":"Readiness Score"},"readiness_status":{"type":"string","enum":["ready","mostly_ready","at_risk","not_ready"],"title":"Readiness Status"},"prerequisites":{"$ref":"#/components/schemas/TaskPrerequisites"},"risk_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Risk Rank"},"impact_if_delayed":{"type":"string","title":"Impact If Delayed","default":""}},"type":"object","required":["task_id","task_name","forecast_start","days_until_start","duration_days","readiness_score","readiness_status"],"title":"HorizonTask","description":"Per-task readiness result within a horizon band."},"ImportData":{"properties":{"normalized_schedule":{"$ref":"#/components/schemas/NormalizedSchedule"},"parse_summary":{"$ref":"#/components/schemas/ParseSummary"},"mapping_stats":{"$ref":"#/components/schemas/MappingStats"},"warnings":{"items":{"$ref":"#/components/schemas/ParseWarning"},"type":"array","title":"Warnings"},"processing_metadata":{"$ref":"#/components/schemas/app__models__schemas__ProcessingMetadata"},"msp_resource_table":{"anyOf":[{"items":{"$ref":"#/components/schemas/MspResource"},"type":"array"},{"type":"null"}],"title":"Msp Resource Table","description":"Full resource pool from <Resources> table. MSP imports only. Includes resource_type (0=Work, 1=Material, 2=Cost) for EVM eligibility checks."},"msp_assignment_table":{"anyOf":[{"items":{"$ref":"#/components/schemas/MspAssignment"},"type":"array"},{"type":"null"}],"title":"Msp Assignment Table","description":"Full assignment records from <Assignments> table. MSP imports only. actual_work_hours drives the resource progression compliance check."}},"type":"object","required":["normalized_schedule","parse_summary","mapping_stats","processing_metadata"],"title":"ImportData","description":"Data payload for all Import API endpoints."},"JobPriority":{"type":"string","enum":["high","normal","low"],"title":"JobPriority","description":"Priority level for async jobs.\n\nPriority levels affect queue position:\n- HIGH: Critical jobs, processed first\n- NORMAL: Standard processing priority\n- LOW: Background jobs, processed when resources available"},"JobStatus":{"type":"string","enum":["queued","processing","completed","failed","cancelled"],"title":"JobStatus","description":"Status of an async job.\n\nJob lifecycle:\n1. QUEUED - Job submitted to queue, waiting for worker\n2. PROCESSING - Worker picked up job and is executing\n3. COMPLETED - Job finished successfully\n4. FAILED - Job encountered an error\n5. CANCELLED - Job was cancelled by user before completion"},"JobStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Job identifier"},"status":{"$ref":"#/components/schemas/JobStatus","description":"Current job status"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Job creation timestamp"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"Job start timestamp"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"Job completion timestamp"},"task_count":{"type":"integer","title":"Task Count","description":"Number of tasks in schedule"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Job result when completed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"},"progress_percent":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Progress Percent","description":"Job progress percentage (if available)"},"endpoint_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Name","description":"Endpoint that submitted this job"},"checks_completed":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Checks Completed","description":"Number of checks/steps completed (for forensics endpoints)"},"total_checks":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Total Checks","description":"Total number of checks/steps (for forensics endpoints)"}},"type":"object","required":["job_id","status","created_at","task_count"],"title":"JobStatusResponse","description":"Response model for job status polling.","example":{"completed_at":"2025-01-08T12:00:20Z","created_at":"2025-01-08T12:00:00Z","job_id":"550e8400-e29b-41d4-a716-446655440000","progress_percent":100.0,"result":{"breakdown":{},"confidence":0.95,"score":85.5,"top_signals":[]},"started_at":"2025-01-08T12:00:05Z","status":"completed","task_count":5000}},"JobSubmissionRequest":{"properties":{"tasks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tasks","description":"List of tasks (same format as synchronous endpoint)"},"callback_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Callback Url","description":"Webhook URL for result delivery (optional)"},"priority":{"$ref":"#/components/schemas/JobPriority","description":"Job priority level","default":"normal"},"include_details":{"type":"boolean","title":"Include Details","description":"Include detailed task-level diagnostics and recommendations","default":false}},"type":"object","required":["tasks"],"title":"JobSubmissionRequest","description":"Request model for submitting async health score job.","example":{"callback_url":"https://customer.example.com/webhooks/bellator","include_details":false,"priority":"normal","tasks":[{"dependencies":[],"duration":10,"id":"T1","percent_complete":0}]}},"JobSubmissionResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Unique job identifier"},"status":{"$ref":"#/components/schemas/JobStatus","description":"Initial job status (queued)"},"estimated_completion_seconds":{"type":"integer","minimum":0.0,"title":"Estimated Completion Seconds","description":"Estimated time until completion"},"status_url":{"type":"string","title":"Status Url","description":"URL to poll job status"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Job creation timestamp"}},"type":"object","required":["job_id","status","estimated_completion_seconds","status_url"],"title":"JobSubmissionResponse","description":"Response model for async job submission.","example":{"created_at":"2025-01-08T12:00:00Z","estimated_completion_seconds":15,"job_id":"550e8400-e29b-41d4-a716-446655440000","status":"queued","status_url":"/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000"}},"KeyEndpointUsage":{"properties":{"endpoint":{"type":"string","title":"Endpoint","description":"Endpoint path"},"calls":{"type":"integer","minimum":0.0,"title":"Calls","description":"Calls for this endpoint"},"tasks":{"type":"integer","minimum":0.0,"title":"Tasks","description":"Tasks processed for this endpoint"},"errors":{"type":"integer","minimum":0.0,"title":"Errors","description":"Error responses for this endpoint"},"avg_response_ms":{"type":"number","minimum":0.0,"title":"Avg Response Ms","description":"Average response time in ms"}},"type":"object","required":["endpoint","calls","tasks","errors","avg_response_ms"],"title":"KeyEndpointUsage","description":"Per-endpoint usage totals for a single key."},"KeyHourlyUsage":{"properties":{"hour":{"type":"string","format":"date-time","title":"Hour","description":"UTC hour bucket"},"calls":{"type":"integer","minimum":0.0,"title":"Calls"},"tasks":{"type":"integer","minimum":0.0,"title":"Tasks"},"errors":{"type":"integer","minimum":0.0,"title":"Errors"}},"type":"object","required":["hour","calls","tasks","errors"],"title":"KeyHourlyUsage","description":"Hourly usage point for trend charts."},"KeyUsageInfoResponse":{"properties":{"usage_count":{"type":"integer","title":"Usage Count","description":"Number of API calls made"},"usage_limit":{"type":"integer","title":"Usage Limit","description":"Maximum number of API calls allowed"},"usage_remaining":{"type":"integer","title":"Usage Remaining","description":"Remaining API calls"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds","description":"Seconds until key expires"},"expires_at":{"type":"string","title":"Expires At","description":"ISO 8601 expiry timestamp"},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 creation timestamp","default":""},"type":{"type":"string","title":"Type","description":"Key type","default":"ephemeral"}},"type":"object","required":["usage_count","usage_limit","usage_remaining","ttl_seconds","expires_at"],"title":"KeyUsageInfoResponse","description":"Response model for key usage information."},"KeyUsageSummary":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"API key ID (UUID)"},"prefix":{"type":"string","title":"Prefix","description":"Key prefix (first 8 chars visible)"},"tasks":{"type":"integer","minimum":0.0,"title":"Tasks","description":"Tasks processed by this key this month"},"calls":{"type":"integer","minimum":0.0,"title":"Calls","description":"API calls made by this key this month"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used","description":"Last usage timestamp"}},"type":"object","required":["key_id","prefix","tasks","calls"],"title":"KeyUsageSummary","description":"Per-key usage summary for dashboard display."},"LevelingCandidate":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"resource_name":{"type":"string","title":"Resource Name"},"total_float_days":{"type":"number","title":"Total Float Days"},"free_float_days":{"type":"number","title":"Free Float Days"},"early_start":{"type":"string","title":"Early Start"},"latest_allowable_start":{"type":"string","title":"Latest Allowable Start"},"leveling_window_days":{"type":"integer","title":"Leveling Window Days"},"resolves_conflict_with":{"items":{"type":"string"},"type":"array","title":"Resolves Conflict With"},"leveling_priority":{"type":"string","enum":["high","medium","low"],"title":"Leveling Priority"}},"type":"object","required":["task_id","task_name","resource_name","total_float_days","free_float_days","early_start","latest_allowable_start","leveling_window_days","leveling_priority"],"title":"LevelingCandidate","description":"A non-critical task that could be shifted to relieve over-allocation."},"LogicAuditData":{"properties":{"logic_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Logic Score","description":"Logic quality score 0-100 (100=perfect logic)"},"grade":{"type":"string","enum":["A","B","C","D","F"],"title":"Grade","description":"Letter grade derived from logic_score"},"summary":{"$ref":"#/components/schemas/LogicAuditSummary","description":"Finding severity counts"},"rule_results":{"items":{"$ref":"#/components/schemas/LogicRuleResult"},"type":"array","title":"Rule Results","description":"Per-rule check results"},"findings":{"items":{"$ref":"#/components/schemas/LogicFinding"},"type":"array","title":"Findings","description":"Actionable defect findings"},"recommended_fixes":{"items":{"$ref":"#/components/schemas/LogicRecommendedFix"},"type":"array","title":"Recommended Fixes","description":"Priority-sorted recommended fixes"},"network_stats":{"anyOf":[{"$ref":"#/components/schemas/NetworkStats"},{"type":"null"}],"description":"Network topology statistics (if include_network_stats=True)"},"audit_metadata":{"additionalProperties":true,"type":"object","title":"Audit Metadata","description":"Analysis metadata (task count, options, etc.)"}},"type":"object","required":["logic_score","grade","summary","rule_results"],"title":"LogicAuditData","description":"Data payload for POST /api/v1/forensics/logic-audit."},"LogicAuditOptions":{"properties":{"max_examples_per_rule":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Examples Per Rule","description":"Maximum number of example task IDs returned per rule","default":10},"include_network_stats":{"type":"boolean","title":"Include Network Stats","description":"Include network topology statistics in response","default":true},"include_forensic_paths":{"type":"boolean","title":"Include Forensic Paths","description":"Include full cycle/path details (may be large)","default":false},"severity_threshold":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity Threshold","description":"Minimum severity level to include in findings","default":"low"},"enable_recommendations":{"type":"boolean","title":"Enable Recommendations","description":"Include recommended fixes in response","default":true},"max_lag_days":{"type":"number","exclusiveMinimum":0.0,"title":"Max Lag Days","description":"Threshold above which a lag is flagged as excessive (days)","default":5.0},"relationship_type_thresholds":{"$ref":"#/components/schemas/RelationshipTypeThresholds","description":"Thresholds for acceptable relationship type distribution"}},"type":"object","title":"LogicAuditOptions","description":"Options controlling Logic Audit analysis behavior."},"LogicAuditRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","minItems":2,"title":"Tasks","description":"Schedule tasks to audit (minimum 2 tasks)"},"options":{"$ref":"#/components/schemas/LogicAuditOptions","description":"Audit configuration options"}},"type":"object","required":["tasks"],"title":"LogicAuditRequest","description":"Request body for POST /api/v1/forensics/logic-audit."},"LogicAuditSummary":{"properties":{"critical":{"type":"integer","minimum":0.0,"title":"Critical","default":0},"high":{"type":"integer","minimum":0.0,"title":"High","default":0},"medium":{"type":"integer","minimum":0.0,"title":"Medium","default":0},"low":{"type":"integer","minimum":0.0,"title":"Low","default":0},"total":{"type":"integer","minimum":0.0,"title":"Total","default":0}},"type":"object","title":"LogicAuditSummary","description":"Summary of finding severity counts."},"LogicCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"added_dependencies":{"type":"integer","title":"Added Dependencies","default":0},"removed_dependencies":{"type":"integer","title":"Removed Dependencies","default":0},"modified_lags":{"type":"integer","title":"Modified Lags","default":0},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"LogicCategoryResult","description":"Result for logic change category."},"LogicChanges":{"properties":{"added_relationships":{"items":{"$ref":"#/components/schemas/LogicRelationship"},"type":"array","title":"Added Relationships"},"removed_relationships":{"items":{"$ref":"#/components/schemas/LogicRelationship"},"type":"array","title":"Removed Relationships"},"retyped_relationships":{"items":{"$ref":"#/components/schemas/RetypedRelationship"},"type":"array","title":"Retyped Relationships"},"summary":{"$ref":"#/components/schemas/LogicChangesSummary"}},"type":"object","title":"LogicChanges","description":"Dependency graph changes between baseline and current."},"LogicChangesSummary":{"properties":{"total_added":{"type":"integer","title":"Total Added","default":0},"total_removed":{"type":"integer","title":"Total Removed","default":0},"total_retyped":{"type":"integer","title":"Total Retyped","default":0},"drift_severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Drift Severity","default":"low"}},"type":"object","title":"LogicChangesSummary","description":"Summary counts and severity for logic drift."},"LogicDiff":{"properties":{"added_relationships":{"items":{"$ref":"#/components/schemas/AddedRelationship"},"type":"array","title":"Added Relationships"},"removed_relationships":{"items":{"$ref":"#/components/schemas/RemovedRelationship"},"type":"array","title":"Removed Relationships"},"modified_relationships":{"items":{"$ref":"#/components/schemas/ModifiedRelationship"},"type":"array","title":"Modified Relationships"},"total_relationship_changes":{"type":"integer","title":"Total Relationship Changes","default":0},"logic_change_severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Logic Change Severity","default":"low"}},"type":"object","title":"LogicDiff","description":"Dependency graph changes between as-planned and as-built."},"LogicDimensionScore":{"properties":{"score":{"type":"number","title":"Score","default":100.0},"status":{"type":"string","title":"Status","default":"complete"},"issues":{"items":{"$ref":"#/components/schemas/ReadinessIssue"},"type":"array","title":"Issues"}},"type":"object","title":"LogicDimensionScore","description":"Logic completeness readiness dimension result."},"LogicFinding":{"properties":{"code":{"type":"string","title":"Code","description":"Finding code (e.g. LOGIC-001)"},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity","description":"Severity level"},"title":{"type":"string","title":"Title","description":"Short finding title"},"description":{"type":"string","title":"Description","description":"Detailed finding description"},"affected_tasks":{"items":{"type":"string"},"type":"array","title":"Affected Tasks","description":"Affected task IDs"},"standard":{"type":"string","title":"Standard","description":"Compliance standard reference","default":""}},"type":"object","required":["code","severity","title","description"],"title":"LogicFinding","description":"A single actionable logic defect finding."},"LogicRecommendedFix":{"properties":{"priority":{"type":"integer","minimum":1.0,"title":"Priority","description":"Fix priority (1=highest)"},"action":{"type":"string","title":"Action","description":"Recommended corrective action"},"affected_count":{"type":"integer","minimum":0.0,"title":"Affected Count","description":"Number of items affected"},"finding_codes":{"items":{"type":"string"},"type":"array","title":"Finding Codes","description":"Related finding codes"}},"type":"object","required":["priority","action","affected_count"],"title":"LogicRecommendedFix","description":"A prioritized recommended fix for a logic defect."},"LogicRelationship":{"properties":{"predecessor_id":{"type":"string","title":"Predecessor Id"},"successor_id":{"type":"string","title":"Successor Id"},"relationship_type":{"type":"string","title":"Relationship Type","default":"FS"},"lag_days":{"type":"integer","title":"Lag Days","default":0}},"type":"object","required":["predecessor_id","successor_id"],"title":"LogicRelationship","description":"An added or removed dependency relationship."},"LogicRiskSubMetric":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"active":{"type":"boolean","title":"Active"},"summary":{"type":"string","title":"Summary","default":""},"open_ends_count":{"type":"integer","title":"Open Ends Count","default":0},"lag_abuse_count":{"type":"integer","title":"Lag Abuse Count","default":0},"hard_constraint_count":{"type":"integer","title":"Hard Constraint Count","default":0},"oos_progress_count":{"type":"integer","title":"Oos Progress Count","default":0}},"type":"object","required":["score","weight","active"],"title":"LogicRiskSubMetric","description":"Logic Risk sub-metric result."},"LogicRuleResult":{"properties":{"rule":{"type":"string","title":"Rule","description":"Rule identifier (e.g. 'leads', 'excessive_lags')"},"passed":{"type":"boolean","title":"Passed","description":"True if the rule passed (no violations found)"},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity","description":"Severity level of this rule"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of violations found"},"examples":{"items":{"type":"string"},"type":"array","title":"Examples","description":"Example task IDs with violations (up to max_examples_per_rule)"},"message":{"type":"string","title":"Message","description":"Human-readable rule result summary"},"standard":{"type":"string","title":"Standard","description":"Compliance standard reference","default":""}},"type":"object","required":["rule","passed","severity","count","message"],"title":"LogicRuleResult","description":"Result for a single logic rule check."},"MappingStats":{"properties":{"constraint_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Constraint Mappings"},"relationship_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Relationship Mappings"},"duration_conversion":{"anyOf":[{"$ref":"#/components/schemas/DurationConversion"},{"type":"null"}]},"calendar_info":{"anyOf":[{"$ref":"#/components/schemas/CalendarInfo"},{"type":"null"}]}},"type":"object","title":"MappingStats","description":"Field mapping statistics for an import operation."},"ModifiedRelationship":{"properties":{"predecessor_id":{"type":"string","title":"Predecessor Id"},"successor_id":{"type":"string","title":"Successor Id"},"planned_type":{"type":"string","title":"Planned Type"},"actual_type":{"type":"string","title":"Actual Type"},"planned_lag":{"type":"integer","title":"Planned Lag","default":0},"actual_lag":{"type":"integer","title":"Actual Lag","default":0}},"type":"object","required":["predecessor_id","successor_id","planned_type","actual_type"],"title":"ModifiedRelationship","description":"A dependency whose type or lag changed."},"MonteCarloRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"iterations":{"type":"integer","maximum":10000.0,"minimum":100.0,"title":"Iterations","description":"Number of simulation iterations","default":1000}},"type":"object","required":["tasks"],"title":"MonteCarloRequest","description":"Request model for Monte Carlo simulation (placeholder)."},"MonteCarloResponse":{"properties":{"simulations":{"type":"integer","title":"Simulations","default":0},"confidence_intervals":{"additionalProperties":true,"type":"object","title":"Confidence Intervals"},"message":{"type":"string","title":"Message","default":"Monte Carlo simulation is not yet implemented"}},"type":"object","title":"MonteCarloResponse","description":"Response model for Monte Carlo simulation (placeholder)."},"MppImportOptions":{"properties":{"strict_validation":{"type":"boolean","title":"Strict Validation","default":true},"auto_detect_start_finish":{"type":"boolean","title":"Auto Detect Start Finish","default":true},"auto_classify_task_types":{"type":"boolean","title":"Auto Classify Task Types","default":true},"use_prefix_classification":{"type":"boolean","title":"Use Prefix Classification","description":"Detect task type from name prefix (e.g., 'SM-Buffer', 'LOE-Support', 'PP-Futurework', 'AE-Engineering'). Fires only when native type is not already set. See Import API Common Patterns § Prefix Classification.","default":true},"include_warnings":{"type":"boolean","title":"Include Warnings","default":true},"preserve_task_ids":{"type":"boolean","title":"Preserve Task Ids","default":true},"baseline_index":{"type":"integer","maximum":10.0,"minimum":-1.0,"title":"Baseline Index","description":"Which baseline to import: 0 = Baseline, 1-10 = Baseline1-Baseline10, -1 = skip baseline import.","default":0},"percent_complete_source":{"type":"string","title":"Percent Complete Source","description":"Which MSP percent complete field to map to percent_complete. Options: 'auto' (resource-aware: PercentWorkComplete for resourced tasks, PercentComplete for unresourced), 'duration' (always PercentComplete), 'work' (always PercentWorkComplete), 'physical' (PhysicalPercentComplete). PhysicalPercentComplete is always captured in physical_percent_complete regardless of this setting.","default":"auto"},"wbs_field_priority":{"items":{"type":"string"},"type":"array","title":"Wbs Field Priority","description":"Ordered list of custom field aliases to check as the source for wbs_code. First alias found in the project definition AND having a non-empty task value wins. Falls back to native <WBS> element if none match. Case-insensitive alias match. Set to [] to always use only the native <WBS> element."},"obs_field_priority":{"items":{"type":"string"},"type":"array","title":"Obs Field Priority","description":"Ordered list of custom field aliases to check as the source for organization_code. First alias with a non-empty task value wins. No native fallback — organization_code remains null if no alias matches. Set to [] to skip OBS extraction entirely."}},"type":"object","title":"MppImportOptions","description":"Options controlling MS Project XML import behavior."},"MppImportRequest":{"properties":{"file_content":{"type":"string","title":"File Content","description":"MS Project XML file content (UTF-8 encoded text)"},"options":{"$ref":"#/components/schemas/MppImportOptions"}},"type":"object","required":["file_content"],"title":"MppImportRequest","description":"Request model for POST /api/v1/import/mpp."},"MspAssignment":{"properties":{"uid":{"type":"string","title":"Uid","description":"Assignment UID"},"task_uid":{"type":"string","title":"Task Uid","description":"Parent task UID (join key to Task)"},"resource_uid":{"type":"string","title":"Resource Uid","description":"Assigned resource UID (join key to MspResource)"},"units":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Units","description":"Allocation fraction (0.5 = 50%)"},"work_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Work Hours","description":"Scheduled work in hours"},"actual_work_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Actual Work Hours","description":"Actual work recorded in hours. Zero on a progressed task indicates 'Updating task status updates resource status' is disabled."},"remaining_work_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Remaining Work Hours","description":"Remaining work in hours"},"percent_work_complete":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Percent Work Complete","description":"Assignment-level percent work complete (distinct from task-level)"},"cost":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Cost","description":"Scheduled cost"},"actual_cost":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Actual Cost","description":"Actual cost incurred"},"start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start","description":"Assignment scheduled start"},"finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Finish","description":"Assignment scheduled finish"},"actual_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Actual Start","description":"Assignment actual start"},"actual_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Actual Finish","description":"Assignment actual finish"},"baseline_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Start","description":"Baseline scheduled start (from <Baseline><Number>N><Start>)"},"baseline_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Finish","description":"Baseline scheduled finish (from <Baseline><Number>N><Finish>)"},"baseline_work_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Baseline Work Hours","description":"Baseline budgeted work in hours (PT format → hours, from <Baseline><Number>N><Work>). Drives BCWS for labor EVM analysis."},"baseline_cost":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Baseline Cost","description":"Baseline cost at time of baseline save (from <Baseline><Number>N><Cost>). Drives BCWS for cost accounts."}},"type":"object","required":["uid","task_uid","resource_uid"],"title":"MspAssignment","description":"One record per <Assignment> element in an MS Project XML file.\n\nCaptures all assignment-level fields. The actual_work_hours field is the\nkey signal for the resource progression compliance check (ANSI/EIA-748)."},"MspResource":{"properties":{"uid":{"type":"string","title":"Uid","description":"Resource UID (XML <UID>)"},"display_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Id","description":"User-facing resource ID (XML <ID>)"},"name":{"type":"string","title":"Name","description":"Resource display name"},"initials":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initials","description":"Resource initials"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"Resource pool / org grouping"},"resource_type":{"type":"integer","title":"Resource Type","description":"Resource type: 0=Work (EVM-bearing), 1=Material (EVM-bearing), 2=Cost (expense only)","default":0},"max_units":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Units","description":"Maximum availability (1.0 = 100%)"},"calendar_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calendar Uid","description":"Resource calendar UID"}},"type":"object","required":["uid","name"],"title":"MspResource","description":"One record per <Resource> element in an MS Project XML file.\n\nCaptures the full resource pool with type information needed for\nEVM eligibility checks and resource progression validation.\nType values: 0=Work, 1=Material, 2=Cost."},"NetworkDetails":{"properties":{"start_tasks":{"items":{"type":"string"},"type":"array","title":"Start Tasks","description":"Tasks with no predecessors"},"finish_tasks":{"items":{"type":"string"},"type":"array","title":"Finish Tasks","description":"Tasks with no successors"},"relationship_types":{"items":{"type":"string"},"type":"array","title":"Relationship Types","description":"Relationship types used (FS, SS, FF, SF)"},"relationship_type_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Relationship Type Distribution","description":"Count of dependencies by relationship type in the effective network view"},"relationship_filter_applied":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Relationship Filter Applied","description":"Relationship-type filter applied to network aggregation (if provided)"},"dependency_count_filtered":{"type":"integer","minimum":0.0,"title":"Dependency Count Filtered","description":"Dependency count after applying relationship-type filter"},"dependency_count_total":{"type":"integer","minimum":0.0,"title":"Dependency Count Total","description":"Total dependency count before applying relationship-type filter"},"has_negative_float":{"type":"boolean","title":"Has Negative Float","description":"Whether any tasks have negative float"}},"type":"object","required":["start_tasks","finish_tasks","relationship_types","dependency_count_filtered","dependency_count_total","has_negative_float"],"title":"NetworkDetails","description":"Network structure details."},"NetworkStats":{"properties":{"total_tasks":{"type":"integer","minimum":0.0,"title":"Total Tasks"},"total_relationships":{"type":"integer","minimum":0.0,"title":"Total Relationships"},"avg_predecessors":{"type":"number","minimum":0.0,"title":"Avg Predecessors"},"avg_successors":{"type":"number","minimum":0.0,"title":"Avg Successors"},"max_predecessors":{"type":"integer","minimum":0.0,"title":"Max Predecessors"},"max_successors":{"type":"integer","minimum":0.0,"title":"Max Successors"},"milestone_count":{"type":"integer","minimum":0.0,"title":"Milestone Count"},"network_density":{"type":"number","minimum":0.0,"title":"Network Density"}},"type":"object","required":["total_tasks","total_relationships","avg_predecessors","avg_successors","max_predecessors","max_successors","milestone_count","network_density"],"title":"NetworkStats","description":"Network topology statistics."},"NormalizedSchedule":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Normalized task list"},"start_task_ids":{"items":{"type":"string"},"type":"array","title":"Start Task Ids"},"finish_task_ids":{"items":{"type":"string"},"type":"array","title":"Finish Task Ids"},"status_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Status Date"},"target_finish_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Finish Date"},"baseline_approved_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Approved Date"},"milestone_task_ids":{"items":{"type":"string"},"type":"array","title":"Milestone Task Ids"},"loe_task_ids":{"items":{"type":"string"},"type":"array","title":"Loe Task Ids"},"apportioned_effort_task_ids":{"items":{"type":"string"},"type":"array","title":"Apportioned Effort Task Ids"},"schedule_margin_task_ids":{"items":{"type":"string"},"type":"array","title":"Schedule Margin Task Ids"},"summary_task_ids":{"items":{"type":"string"},"type":"array","title":"Summary Task Ids"},"planning_package_task_ids":{"items":{"type":"string"},"type":"array","title":"Planning Package Task Ids"},"summary_level_pp_task_ids":{"items":{"type":"string"},"type":"array","title":"Summary Level Pp Task Ids"},"schedule_visibility_task_ids":{"items":{"type":"string"},"type":"array","title":"Schedule Visibility Task Ids"},"resource_availability":{"items":{"$ref":"#/components/schemas/ResourceAvailability-Output"},"type":"array","title":"Resource Availability"},"working_hours_per_day":{"type":"number","exclusiveMinimum":0.0,"title":"Working Hours Per Day","default":8.0},"working_days_per_week":{"type":"number","exclusiveMinimum":0.0,"title":"Working Days Per Week","default":5.0},"holidays":{"items":{"type":"string"},"type":"array","title":"Holidays"}},"type":"object","required":["tasks"],"title":"NormalizedSchedule","description":"The canonical schedule representation produced by all Import APIs.\n\nCompatible with ScheduleRequest (can be passed directly to analysis\nendpoints). Extends ScheduleRequest with task-type exclusion arrays\nand calendar metadata per normalized-schedule-schema.md v1.4.0."},"OverAllocationPeriod":{"properties":{"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"demand_units":{"type":"number","title":"Demand Units"},"capacity_units":{"type":"number","title":"Capacity Units"},"over_allocation_ratio":{"type":"number","title":"Over Allocation Ratio"},"severity":{"type":"string","enum":["minor","moderate","critical"],"title":"Severity"},"conflicting_tasks":{"items":{"type":"string"},"type":"array","title":"Conflicting Tasks"}},"type":"object","required":["period_start","period_end","demand_units","capacity_units","over_allocation_ratio","severity"],"title":"OverAllocationPeriod","description":"A period when a resource exceeds its declared capacity."},"PageFeedbackRequest":{"properties":{"response":{"type":"string","enum":["yes","no"],"title":"Response","description":"Helpfulness response"},"page_path":{"type":"string","maxLength":255,"minLength":1,"title":"Page Path","description":"Page path"},"source":{"type":"string","maxLength":100,"title":"Source","description":"Source identifier","default":"docs_page"}},"type":"object","required":["response","page_path"],"title":"PageFeedbackRequest","description":"Request schema for docs page helpfulness feedback."},"ParseSummary":{"properties":{"source_format":{"type":"string","title":"Source Format","description":"Source format: mpp-xml, p6-xer"},"source_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Version","description":"Source application version string"},"tasks_imported":{"type":"integer","minimum":0.0,"title":"Tasks Imported"},"dependencies_imported":{"type":"integer","minimum":0.0,"title":"Dependencies Imported","default":0},"fields_populated":{"items":{"type":"string"},"type":"array","title":"Fields Populated"},"fields_missing":{"items":{"type":"string"},"type":"array","title":"Fields Missing"},"auto_detected":{"$ref":"#/components/schemas/AutoDetected"},"custom_fields_discovered":{"items":{"type":"string"},"type":"array","title":"Custom Fields Discovered","description":"Aliases of WBS/OBS-pattern custom fields found in the project's ExtendedAttributes or OutlineCodes. Empty list when none discovered (e.g., XER imports or projects using only native <WBS>)."}},"type":"object","required":["source_format","tasks_imported"],"title":"ParseSummary","description":"Summary statistics for a completed import parse operation."},"ParseWarning":{"properties":{"type":{"type":"string","title":"Type","description":"Warning type: missing_field, ambiguous_mapping, data_loss"},"severity":{"type":"string","title":"Severity","description":"Severity: info, warning, error","default":"warning"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Task ID associated with the warning"},"message":{"type":"string","title":"Message","description":"Human-readable warning message"},"details":{"anyOf":[{},{"type":"null"}],"title":"Details","description":"Additional structured details"}},"type":"object","required":["type","message"],"title":"ParseWarning","description":"A non-fatal warning emitted during import parsing."},"PercentileResult":{"properties":{"p10":{"type":"number","title":"P10","description":"10th percentile outcome"},"p50":{"type":"number","title":"P50","description":"50th percentile (median)"},"p80":{"type":"number","title":"P80","description":"80th percentile — common contract delivery threshold"},"p90":{"type":"number","title":"P90","description":"90th percentile"},"mean":{"type":"number","title":"Mean"},"std_dev":{"type":"number","title":"Std Dev"}},"type":"object","required":["p10","p50","p80","p90","mean","std_dev"],"title":"PercentileResult","description":"Percentile distribution across simulation trials.\n\nReserved for Tier 3 Monte Carlo / risk simulation endpoints (v0.3.0+)."},"PlanningHorizonData":{"properties":{"analysis_summary":{"$ref":"#/components/schemas/AnalysisSummary"},"bands":{"items":{"$ref":"#/components/schemas/HorizonBandResult"},"type":"array","title":"Bands"},"cross_band_insights":{"$ref":"#/components/schemas/CrossBandInsights"},"recommendations":{"items":{"$ref":"#/components/schemas/HorizonRecommendation"},"type":"array","title":"Recommendations"},"compliance_tags":{"items":{"type":"string"},"type":"array","title":"Compliance Tags"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","title":"PlanningHorizonData","description":"Data payload for POST /api/v1/forensics/planning-horizon."},"PlanningHorizonOptions":{"properties":{"horizon_bands":{"items":{"$ref":"#/components/schemas/HorizonBandConfig"},"type":"array","title":"Horizon Bands"},"readiness_dimensions":{"items":{"type":"string","enum":["logic","resources","approvals","float","forecast_stability"]},"type":"array","title":"Readiness Dimensions"},"day_type":{"type":"string","enum":["calendar","work"],"title":"Day Type","default":"calendar"},"include_risk_ranking":{"type":"boolean","title":"Include Risk Ranking","default":true},"include_recommendations":{"type":"boolean","title":"Include Recommendations","default":true},"min_float_days":{"type":"integer","minimum":0.0,"title":"Min Float Days","default":5},"max_forecast_drift_days":{"type":"integer","minimum":0.0,"title":"Max Forecast Drift Days","default":3}},"type":"object","title":"PlanningHorizonOptions","description":"Options controlling planning horizon analysis."},"PlanningHorizonRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Schedule tasks."},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"Current data date (ISO 8601, e.g. '2026-03-17'). When omitted, today's date is used as the planning horizon anchor."},"schedule_history":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Schedule History"},"options":{"$ref":"#/components/schemas/PlanningHorizonOptions"}},"type":"object","required":["tasks"],"title":"PlanningHorizonRequest","description":"Request body for POST /api/v1/forensics/planning-horizon."},"PlaygroundFeedbackRequest":{"properties":{"email":{"type":"string","maxLength":255,"minLength":5,"title":"Email","description":"Submitter email"},"category":{"type":"string","enum":["bug","feature","question","other"],"title":"Category","description":"Feedback category","default":"other"},"feedback":{"type":"string","maxLength":5000,"minLength":1,"title":"Feedback","description":"Feedback message"},"source":{"type":"string","maxLength":100,"title":"Source","description":"Source page identifier","default":"playground"}},"type":"object","required":["email","feedback"],"title":"PlaygroundFeedbackRequest","description":"Request schema for playground feedback endpoint."},"PoPDimension":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"}},"type":"object","required":["score","weight"],"title":"PoPDimension","description":"Single PoP dimension score and weight."},"PoPRiskFactor":{"properties":{"factor":{"type":"string","title":"Factor"},"score":{"type":"number","title":"Score"},"severity":{"type":"string","title":"Severity"},"description":{"type":"string","title":"Description"},"recommendation":{"type":"string","title":"Recommendation"}},"type":"object","required":["factor","score","severity","description","recommendation"],"title":"PoPRiskFactor","description":"A deliverability risk factor from PoP assessment."},"PortalSessionResponse":{"properties":{"portal_url":{"type":"string","title":"Portal Url","description":"Stripe Customer Portal URL — redirect user here"}},"type":"object","required":["portal_url"],"title":"PortalSessionResponse","description":"Stripe Customer Portal session response.\n\nAttributes:\n    portal_url: Stripe-hosted portal URL; redirect user here."},"ProbabilityOfPerformance":{"properties":{"pop_score":{"type":"number","title":"Pop Score"},"rating":{"type":"string","title":"Rating"},"confidence":{"type":"number","title":"Confidence"},"dimensions":{"additionalProperties":{"$ref":"#/components/schemas/PoPDimension"},"type":"object","title":"Dimensions"},"risk_factors":{"items":{"$ref":"#/components/schemas/PoPRiskFactor"},"type":"array","title":"Risk Factors"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations"}},"type":"object","required":["pop_score","rating","confidence","dimensions"],"title":"ProbabilityOfPerformance","description":"Probability of Performance (PoP) — schedule deliverability score (v0.2.0)."},"ProgressAuditData":{"properties":{"integrity_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Integrity Score","description":"Progress integrity score 0-100 (100=no anomalies)"},"grade":{"type":"string","enum":["A","B","C","D","F"],"title":"Grade","description":"Letter grade derived from integrity_score"},"summary":{"$ref":"#/components/schemas/ProgressAuditSummary","description":"Anomaly severity counts"},"anomalies":{"items":{"$ref":"#/components/schemas/app__models__schemas__ProgressAnomaly__2"},"type":"array","title":"Anomalies","description":"All detected progress anomalies"},"recommendations":{"items":{"$ref":"#/components/schemas/ProgressAuditRecommendation"},"type":"array","title":"Recommendations","description":"Priority-sorted remediation recommendations"},"audit_metadata":{"additionalProperties":true,"type":"object","title":"Audit Metadata","description":"Analysis metadata (task count, status_date, options, etc.)"}},"type":"object","required":["integrity_score","grade","summary"],"title":"ProgressAuditData","description":"Data payload for POST /api/v1/forensics/progress-audit."},"ProgressAuditOptions":{"properties":{"status_date":{"type":"string","title":"Status Date","description":"Project data date (ISO 8601, e.g. '2025-06-30'). Required."},"exclude_milestones":{"type":"boolean","title":"Exclude Milestones","description":"Exclude zero-duration tasks from progress checks.","default":true},"max_examples":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Examples","description":"Maximum anomaly examples to return per category.","default":10},"include_recommendations":{"type":"boolean","title":"Include Recommendations","description":"Include recommended remediation steps.","default":true}},"type":"object","required":["status_date"],"title":"ProgressAuditOptions","description":"Configuration options for the progress audit check."},"ProgressAuditRecommendation":{"properties":{"priority":{"type":"integer","minimum":1.0,"title":"Priority","description":"Recommendation priority (1=highest)"},"category":{"type":"string","title":"Category","description":"Anomaly category this addresses"},"action":{"type":"string","title":"Action","description":"Recommended corrective action"},"affected_count":{"type":"integer","minimum":0.0,"title":"Affected Count","description":"Number of items affected"},"severity":{"type":"string","enum":["critical","high","medium","low"],"title":"Severity","description":"Severity of the addressed anomalies"}},"type":"object","required":["priority","category","action","affected_count","severity"],"title":"ProgressAuditRecommendation","description":"A prioritized remediation recommendation for progress anomalies."},"ProgressAuditRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","minItems":2,"title":"Tasks","description":"Schedule tasks to audit (minimum 2)."},"options":{"$ref":"#/components/schemas/ProgressAuditOptions","description":"Audit options including required status_date."}},"type":"object","required":["tasks","options"],"title":"ProgressAuditRequest","description":"Request body for POST /api/v1/forensics/progress-audit."},"ProgressAuditSummary":{"properties":{"critical":{"type":"integer","minimum":0.0,"title":"Critical","default":0},"high":{"type":"integer","minimum":0.0,"title":"High","default":0},"medium":{"type":"integer","minimum":0.0,"title":"Medium","default":0},"low":{"type":"integer","minimum":0.0,"title":"Low","default":0},"total":{"type":"integer","minimum":0.0,"title":"Total","default":0}},"type":"object","title":"ProgressAuditSummary","description":"Summary counts of anomalies by severity."},"ProgressCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"anomalies":{"items":{"$ref":"#/components/schemas/app__models__schemas__ProgressAnomaly__1"},"type":"array","title":"Anomalies"},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"ProgressCategoryResult","description":"Result for progress anomaly category."},"ProgressIntegritySubMetric":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"active":{"type":"boolean","title":"Active"},"summary":{"type":"string","title":"Summary","default":""},"anomaly_count":{"type":"integer","title":"Anomaly Count","default":0},"future_actuals_count":{"type":"integer","title":"Future Actuals Count","default":0},"invalid_sequence_count":{"type":"integer","title":"Invalid Sequence Count","default":0}},"type":"object","required":["score","weight","active"],"title":"ProgressIntegritySubMetric","description":"Progress Integrity Risk sub-metric result."},"ReadinessIssue":{"properties":{"issue_type":{"type":"string","title":"Issue Type"},"severity":{"type":"string","enum":["critical","high","medium","low"],"title":"Severity"},"description":{"type":"string","title":"Description"},"recommendation":{"type":"string","title":"Recommendation"}},"type":"object","required":["issue_type","severity","description","recommendation"],"title":"ReadinessIssue","description":"A single readiness issue for one dimension."},"Recommendation":{"properties":{"priority":{"$ref":"#/components/schemas/FindingSeverity"},"action":{"type":"string","title":"Action","description":"What to do — specific and actionable"},"standard":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard","description":"Supporting standard citation"},"finding_codes":{"items":{"type":"string"},"type":"array","title":"Finding Codes","description":"Finding.code values this recommendation addresses"}},"type":"object","required":["priority","action"],"title":"Recommendation","description":"An actionable item tied to one or more findings.\n\n`finding_codes` links each recommendation back to the specific Finding(s)\nit addresses, enabling consumers to correlate actions with evidence."},"RelationshipType":{"type":"string","enum":["FS","SS","FF","SF"],"title":"RelationshipType","description":"Task relationship types per PMBOK 6.3.2.2.\n\nAttributes:\n    FINISH_START: Predecessor finish → successor start (most common, ~90%)\n    START_START: Predecessor start → successor start (~5%)\n    FINISH_FINISH: Predecessor finish → successor finish (~4%)\n    START_FINISH: Predecessor start → successor finish (rare, ~1%)"},"RelationshipTypeThresholds":{"properties":{"fs_min_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Fs Min Percentage","description":"Minimum FS relationship percentage (default 80%)","default":80.0},"ss_max_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Ss Max Percentage","description":"Maximum SS relationship percentage (default 20%)","default":20.0},"ff_max_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Ff Max Percentage","description":"Maximum FF relationship percentage (default 20%)","default":20.0},"sf_max_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Sf Max Percentage","description":"Maximum SF relationship percentage (default 5%)","default":5.0}},"type":"object","title":"RelationshipTypeThresholds","description":"Configurable thresholds for relationship type distribution checks."},"RemovedRelationship":{"properties":{"predecessor_id":{"type":"string","title":"Predecessor Id"},"successor_id":{"type":"string","title":"Successor Id"},"planned_type":{"type":"string","title":"Planned Type","default":"FS"}},"type":"object","required":["predecessor_id","successor_id"],"title":"RemovedRelationship","description":"A dependency removed from the as-planned schedule."},"ResourceAllocationRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"resources":{"items":{"type":"string"},"type":"array","title":"Resources","description":"Available resources"}},"type":"object","required":["tasks"],"title":"ResourceAllocationRequest","description":"Request model for resource allocation (placeholder)."},"ResourceAllocationResponse":{"properties":{"allocation":{"additionalProperties":true,"type":"object","title":"Allocation","description":"Resource allocation results"},"message":{"type":"string","title":"Message","default":"Resource allocation is not yet implemented"}},"type":"object","title":"ResourceAllocationResponse","description":"Response model for resource allocation (placeholder)."},"ResourceAnalysisData":{"properties":{"summary":{"$ref":"#/components/schemas/ResourceAnalysisSummary"},"resource_profiles":{"items":{"$ref":"#/components/schemas/ResourceProfile"},"type":"array","title":"Resource Profiles"},"critical_path_resources":{"$ref":"#/components/schemas/CriticalPathResources"},"leveling_candidates":{"items":{"$ref":"#/components/schemas/LevelingCandidate"},"type":"array","title":"Leveling Candidates"},"unresourced_tasks":{"items":{"$ref":"#/components/schemas/UnresourcedTask"},"type":"array","title":"Unresourced Tasks"},"resource_risk_score":{"$ref":"#/components/schemas/ResourceRiskScore"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata","description":"Processing metadata (task count, options, etc.)"}},"type":"object","required":["summary","resource_risk_score"],"title":"ResourceAnalysisData","description":"Data payload for POST /api/v1/forensics/resource-analysis."},"ResourceAnalysisOptions":{"properties":{"period_size_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Period Size Days","description":"Histogram bucket size in days","default":7},"include_histogram_data":{"type":"boolean","title":"Include Histogram Data","description":"Include demand histogram per resource","default":true},"include_leveling_candidates":{"type":"boolean","title":"Include Leveling Candidates","description":"Include leveling candidate tasks","default":true},"include_critical_path_resources":{"type":"boolean","title":"Include Critical Path Resources","description":"Include CP resource section","default":true},"include_resource_curves":{"type":"boolean","title":"Include Resource Curves","description":"Include cumulative resource curves","default":false},"over_allocation_threshold":{"type":"number","maximum":3.0,"minimum":0.5,"title":"Over Allocation Threshold","description":"Multiplier of declared capacity (or 1.0/day default) that triggers over-allocation","default":1.0},"exclude_task_types":{"items":{"type":"string"},"type":"array","title":"Exclude Task Types","description":"Task types to exclude from analysis (e.g. 'loe', 'summary')"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Response fields to include (sparse fieldset)"}},"type":"object","title":"ResourceAnalysisOptions","description":"Options controlling resource analysis behaviour."},"ResourceAnalysisRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Schedule tasks"},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"Schedule status date (ISO 8601 YYYY-MM-DD). When omitted, today's date is used as the resource loading window anchor."},"resource_availability":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__models__schemas__ResourceAvailability__2"},"type":"array"},{"type":"null"}],"title":"Resource Availability","description":"Optional declared resource capacities"},"options":{"$ref":"#/components/schemas/ResourceAnalysisOptions","description":"Analysis options"}},"type":"object","required":["tasks"],"title":"ResourceAnalysisRequest","description":"Request for POST /api/v1/forensics/resource-analysis."},"ResourceAnalysisSummary":{"properties":{"total_resources":{"type":"integer","title":"Total Resources"},"over_allocated_resources":{"type":"integer","title":"Over Allocated Resources"},"critical_path_resources":{"type":"integer","title":"Critical Path Resources"},"resource_coverage_pct":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Resource Coverage Pct"},"loe_excluded_count":{"type":"integer","title":"Loe Excluded Count"},"dcma_check_10_compliant":{"type":"boolean","title":"Dcma Check 10 Compliant"},"dcma_check_10_details":{"type":"string","title":"Dcma Check 10 Details"},"peak_demand_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peak Demand Period"},"total_resource_days":{"type":"number","title":"Total Resource Days"}},"type":"object","required":["total_resources","over_allocated_resources","critical_path_resources","resource_coverage_pct","loe_excluded_count","dcma_check_10_compliant","dcma_check_10_details","total_resource_days"],"title":"ResourceAnalysisSummary","description":"High-level summary of resource analysis results."},"ResourceAvailability-Output":{"properties":{"resource_name":{"type":"string","title":"Resource Name","description":"Resource name (must match tasks[*].resources)"},"available_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available From","description":"Start of availability window (ISO 8601). Null = project start."},"available_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available To","description":"End of availability window (ISO 8601). Null = project finish."},"units_per_day":{"type":"number","minimum":0.0,"title":"Units Per Day","description":"Available resource-units per working day (default: 1.0 = 100%)","default":1.0}},"type":"object","required":["resource_name"],"title":"ResourceAvailability","description":"Per-resource availability window for Resource Analysis.\n\nSpecifies how many units of a resource are available over a date range.\nresource_name must match a value appearing in tasks[*].resources."},"ResourceCategoryResult":{"properties":{"total_changes":{"type":"integer","title":"Total Changes","default":0},"material_changes":{"type":"integer","title":"Material Changes","default":0},"resources_added":{"type":"integer","title":"Resources Added","default":0},"resources_removed":{"type":"integer","title":"Resources Removed","default":0},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","title":"ResourceCategoryResult","description":"Result for resource change category."},"ResourceDiff":{"properties":{"planned_resources":{"additionalProperties":{"type":"integer"},"type":"object","title":"Planned Resources"},"actual_resources":{"additionalProperties":{"type":"integer"},"type":"object","title":"Actual Resources"},"added_resources":{"items":{"type":"string"},"type":"array","title":"Added Resources"},"removed_resources":{"items":{"type":"string"},"type":"array","title":"Removed Resources"},"utilization_variance_pct":{"additionalProperties":{"type":"number"},"type":"object","title":"Utilization Variance Pct"}},"type":"object","title":"ResourceDiff","description":"Resource allocation changes between as-planned and as-built."},"ResourceDimensionScore":{"properties":{"score":{"type":"number","title":"Score","default":100.0},"status":{"type":"string","title":"Status","default":"complete"},"resources_assigned":{"type":"integer","title":"Resources Assigned","default":0},"issues":{"items":{"$ref":"#/components/schemas/ReadinessIssue"},"type":"array","title":"Issues"}},"type":"object","title":"ResourceDimensionScore","description":"Resource assignment readiness dimension result."},"ResourceProfile":{"properties":{"resource_name":{"type":"string","title":"Resource Name"},"total_task_days":{"type":"number","title":"Total Task Days"},"assigned_task_count":{"type":"integer","title":"Assigned Task Count"},"on_critical_path":{"type":"boolean","title":"On Critical Path"},"declared_capacity_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Capacity Per Day"},"peak_demand_per_day":{"type":"number","title":"Peak Demand Per Day"},"over_allocation_periods":{"items":{"$ref":"#/components/schemas/OverAllocationPeriod"},"type":"array","title":"Over Allocation Periods"},"histogram":{"items":{"$ref":"#/components/schemas/HistogramBucket"},"type":"array","title":"Histogram"},"cumulative_curve":{"items":{"$ref":"#/components/schemas/CumulativeCurveBucket"},"type":"array","title":"Cumulative Curve"}},"type":"object","required":["resource_name","total_task_days","assigned_task_count","on_critical_path","peak_demand_per_day"],"title":"ResourceProfile","description":"Full demand profile for a single named resource."},"ResourceRiskComponents":{"properties":{"over_allocation_severity":{"type":"number","title":"Over Allocation Severity"},"coverage_gap":{"type":"number","title":"Coverage Gap"},"cp_resource_conflict":{"type":"number","title":"Cp Resource Conflict"}},"type":"object","required":["over_allocation_severity","coverage_gap","cp_resource_conflict"],"title":"ResourceRiskComponents","description":"Component scores that make up the resource risk score."},"ResourceRiskScore":{"properties":{"score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Score"},"grade":{"type":"string","enum":["A","B","C","D","F"],"title":"Grade"},"components":{"$ref":"#/components/schemas/ResourceRiskComponents"},"explanation":{"type":"string","title":"Explanation"}},"type":"object","required":["score","grade","components","explanation"],"title":"ResourceRiskScore","description":"Composite resource risk score."},"ResourceRiskSubMetric":{"properties":{"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"active":{"type":"boolean","title":"Active"},"summary":{"type":"string","title":"Summary","default":""},"over_allocated_resources":{"type":"integer","title":"Over Allocated Resources","default":0},"unresourced_task_pct":{"type":"number","title":"Unresourced Task Pct","default":0.0},"cp_resource_conflict":{"type":"boolean","title":"Cp Resource Conflict","default":false}},"type":"object","required":["score","weight","active"],"title":"ResourceRiskSubMetric","description":"Resource Risk sub-metric result."},"ResponseMetadata":{"properties":{"task_count":{"type":"integer","title":"Task Count","description":"Number of tasks in the submitted schedule"},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms","description":"Wall-clock processing time in milliseconds"},"api_version":{"type":"string","title":"Api Version","description":"API version that produced this response","default":"v0.2.0"},"endpoint":{"type":"string","title":"Endpoint","description":"Endpoint path e.g. /api/v1/health/score"},"standards_applied":{"items":{"type":"string"},"type":"array","title":"Standards Applied","description":"Standards consulted during analysis e.g. ['DCMA PAM 200.1', 'GAO BP-2']"},"confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Confidence","description":"Confidence in the result (0–1). Present on scoring endpoints."},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"ISO date used as analysis reference point. Present on time-aware analyses."}},"type":"object","required":["task_count","endpoint"],"title":"ResponseMetadata","description":"Audit trail and processing context — always present, never null."},"ResponseStatus":{"type":"string","enum":["pass","fail","warning","info"],"title":"ResponseStatus","description":"Top-level result status — always present in every response."},"RetypedRelationship":{"properties":{"predecessor_id":{"type":"string","title":"Predecessor Id"},"successor_id":{"type":"string","title":"Successor Id"},"baseline_type":{"type":"string","title":"Baseline Type"},"current_type":{"type":"string","title":"Current Type"}},"type":"object","required":["predecessor_id","successor_id","baseline_type","current_type"],"title":"RetypedRelationship","description":"A dependency whose type changed."},"RevokeKeyResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"},"revoked":{"type":"boolean","title":"Revoked","description":"Whether key was successfully revoked"}},"type":"object","required":["message","revoked"],"title":"RevokeKeyResponse","description":"Response model for key revocation."},"RiskDriver":{"properties":{"rank":{"type":"integer","title":"Rank"},"driver_type":{"type":"string","title":"Driver Type"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"task_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Name"},"description":{"type":"string","title":"Description"},"contributing_sub_metrics":{"items":{"type":"string"},"type":"array","title":"Contributing Sub Metrics"},"score_contribution":{"type":"number","title":"Score Contribution"},"severity":{"type":"string","title":"Severity"},"on_critical_path":{"type":"boolean","title":"On Critical Path","default":false}},"type":"object","required":["rank","driver_type","description","score_contribution","severity"],"title":"RiskDriver","description":"A top risk driver contributing to the SRI score."},"RiskIndicator":{"properties":{"indicator":{"type":"string","title":"Indicator"},"count":{"type":"integer","title":"Count"},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity"},"recommendation":{"type":"string","title":"Recommendation"}},"type":"object","required":["indicator","count","severity","recommendation"],"title":"RiskIndicator","description":"A risk indicator flagged during trend analysis."},"SRIRecommendation":{"properties":{"priority":{"type":"string","title":"Priority"},"action":{"type":"string","title":"Action"},"target_sub_metric":{"type":"string","title":"Target Sub Metric"},"expected_score_reduction":{"type":"number","title":"Expected Score Reduction"},"standards_citation":{"type":"string","title":"Standards Citation"}},"type":"object","required":["priority","action","target_sub_metric","expected_score_reduction","standards_citation"],"title":"SRIRecommendation","description":"Prioritized SRI risk mitigation recommendation."},"SRIScore":{"properties":{"score":{"type":"number","title":"Score"},"grade":{"type":"string","title":"Grade"},"risk_level":{"type":"string","title":"Risk Level"},"trend":{"type":"string","title":"Trend","default":"insufficient_data"},"confidence":{"type":"number","title":"Confidence"},"data_completeness_pct":{"type":"number","title":"Data Completeness Pct"}},"type":"object","required":["score","grade","risk_level","confidence","data_completeness_pct"],"title":"SRIScore","description":"Top-level SRI composite score."},"SRISubMetrics":{"properties":{"float_risk":{"$ref":"#/components/schemas/FloatRiskSubMetric"},"logic_risk":{"$ref":"#/components/schemas/LogicRiskSubMetric"},"baseline_drift_risk":{"$ref":"#/components/schemas/BaselineDriftSubMetric"},"progress_integrity_risk":{"$ref":"#/components/schemas/ProgressIntegritySubMetric"},"resource_risk":{"$ref":"#/components/schemas/ResourceRiskSubMetric"}},"type":"object","required":["float_risk","logic_risk","baseline_drift_risk","progress_integrity_risk","resource_risk"],"title":"SRISubMetrics","description":"All five SRI sub-metric results."},"SandboxFixtureCatalog":{"properties":{"fixture_version":{"type":"string","title":"Fixture Version","description":"Fixture data version (tied to API minor version)"},"fixture_count":{"type":"integer","title":"Fixture Count","description":"Number of loaded fixtures"},"fixtures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Fixtures","description":"Full fixture catalog with metadata"}},"type":"object","required":["fixture_version","fixture_count","fixtures"],"title":"SandboxFixtureCatalog","description":"Response from GET /api/v1/sandbox/fixtures.","example":{"fixture_count":12,"fixture_version":"0.2.0","fixtures":[{"description":"Fully compliant 25-task schedule. No violations.","domain":"construction","expected_outcomes":{"dcma_14_point":{"checks_failed":0,"overall_pass":true},"health_score":{"grade":"A","score_range":[88,95]}},"name":"clean_baseline_sample","recommended_endpoints":["/api/v1/health/score","/api/v1/schedule/cpm","/api/v1/forensics/dcma-14-point"],"task_count":25}]}},"ScheduleHistorySnapshot":{"properties":{"snapshot_date":{"type":"string","title":"Snapshot Date","description":"Snapshot date (ISO 8601)"},"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"Task list at snapshot time"}},"type":"object","required":["snapshot_date"],"title":"ScheduleHistorySnapshot","description":"A historical snapshot of schedule tasks for retroactive date change detection."},"ScheduleInput":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks","description":"List of tasks in the schedule"},"include_details":{"type":"boolean","title":"Include Details","description":"Include detailed task-level diagnostics and actionable recommendations","default":false},"use_ml_scoring":{"type":"boolean","title":"Use Ml Scoring","description":"Use ML ensemble model for score aggregation with SHAP explainability (Professional+ tiers only)","default":false}},"type":"object","required":["tasks"],"title":"ScheduleInput","description":"Input model for schedule health scoring request.\n\nTask limit validation:\n- Uses settings.task_limit_sync (default 1000) for synchronous processing\n- Tier-based limits enforced by TierValidationMiddleware","example":{"tasks":[{"duration_days":10,"id":"T1","percent_complete":0,"planned_finish":"2025-01-15","planned_start":"2025-01-01","predecessors":[]},{"duration_days":15,"id":"T2","percent_complete":0,"planned_finish":"2025-02-05","planned_start":"2025-01-16","predecessors":["T1"]}]}},"ScheduleRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","maxItems":100000,"title":"Tasks","description":"List of tasks in the schedule"},"start_task_ids":{"items":{"type":"string"},"type":"array","title":"Start Task Ids","description":"Task IDs that anchor the project start (DCMA Check #1). If empty, tasks with no predecessors are treated as start tasks."},"finish_task_ids":{"items":{"type":"string"},"type":"array","title":"Finish Task Ids","description":"Task IDs that anchor the project finish (DCMA Check #1). If empty, tasks with no successors are treated as finish tasks."},"status_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Status Date","description":"Data date / status date for progress validation (ISO 8601 YYYY-MM-DD)"},"target_finish_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Finish Date","description":"Target project finish date or key milestone date for CPLI calculation (ISO 8601)"},"baseline_approved_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Approved Date","description":"Date when baseline was approved (for governance tracking)"},"resource_availability":{"items":{"$ref":"#/components/schemas/app__models__schemas__ResourceAvailability__1"},"type":"array","title":"Resource Availability","description":"Per-resource availability for over-allocation detection (Resource Analysis API)."},"options":{"$ref":"#/components/schemas/ValidationOptions","description":"Validation options including Probability of Performance (v0.2.0)."}},"type":"object","required":["tasks"],"title":"ScheduleRequest","description":"Request model for schedule analysis.\n\nThis is the base schedule payload used across all Tier 1 and Tier 2 APIs.\nAdditional Tier 2-specific fields enable full DCMA 14-Point compliance.","example":{"tasks":[{"duration_days":5,"id":"T1","name":"Design","predecessors":[]},{"duration_days":10,"id":"T2","name":"Development","predecessors":["T1"]},{"duration_days":5,"id":"T3","name":"Testing","predecessors":["T2"]}]}},"ScheduleRiskIndexData":{"properties":{"schedule_risk_index":{"$ref":"#/components/schemas/SRIScore"},"sub_metrics":{"$ref":"#/components/schemas/SRISubMetrics"},"risk_drivers":{"items":{"$ref":"#/components/schemas/RiskDriver"},"type":"array","title":"Risk Drivers"},"recommendations":{"items":{"$ref":"#/components/schemas/SRIRecommendation"},"type":"array","title":"Recommendations"},"sub_metric_details":{"additionalProperties":true,"type":"object","title":"Sub Metric Details"},"processing_metadata":{"additionalProperties":true,"type":"object","title":"Processing Metadata"}},"type":"object","required":["schedule_risk_index","sub_metrics"],"title":"ScheduleRiskIndexData","description":"Data payload for POST /api/v1/forensics/schedule-risk-index."},"ScheduleRiskIndexOptions":{"properties":{"sub_metrics":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Sub Metrics","default":"auto"},"include_risk_drivers":{"type":"boolean","title":"Include Risk Drivers","default":true},"include_recommendations":{"type":"boolean","title":"Include Recommendations","default":true},"include_sub_metric_details":{"type":"boolean","title":"Include Sub Metric Details","default":false},"exclude_task_types":{"items":{"type":"string"},"type":"array","title":"Exclude Task Types"},"baseline_weight_override":{"anyOf":[{"$ref":"#/components/schemas/SubMetricWeights"},{"type":"null"}]},"near_critical_float_threshold":{"type":"number","minimum":0.0,"title":"Near Critical Float Threshold","default":5.0},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields"}},"type":"object","title":"ScheduleRiskIndexOptions","description":"Options for POST /api/v1/forensics/schedule-risk-index."},"ScheduleRiskIndexRequest":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/Task"},"type":"array","title":"Tasks"},"status_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Date","description":"Project data date (ISO 8601, e.g. '2026-03-17'). When omitted, Progress Integrity Risk is skipped and Baseline Drift Risk runs in degraded mode. Float Risk and Logic Risk remain fully active."},"options":{"$ref":"#/components/schemas/ScheduleRiskIndexOptions"}},"type":"object","required":["tasks"],"title":"ScheduleRiskIndexRequest","description":"Request for POST /api/v1/forensics/schedule-risk-index."},"ScoreComponent":{"properties":{"score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Score","description":"Dimension score 0–100"},"weight":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Weight","description":"Contribution weight (all weights sum to 1.0)"},"label":{"type":"string","title":"Label","description":"Human-readable dimension name"},"detail":{"additionalProperties":true,"type":"object","title":"Detail","description":"Computed inputs that drove this score — the defensible justification layer"}},"type":"object","required":["score","weight","label"],"title":"ScoreComponent","description":"One named dimension in a breakdown dict.\n\nThe `detail` field carries the computed inputs that drove this score —\ncounts, percentages, threshold values, standard references.  It is\nintentionally open so each dimension can surface whatever is relevant\nwithout a fixed sub-schema."},"SimulationEnvelope":{"properties":{"method":{"type":"string","title":"Method","description":"Simulation method: monte_carlo | latin_hypercube"},"trial_count":{"type":"integer","title":"Trial Count"},"duration_days":{"anyOf":[{"$ref":"#/components/schemas/PercentileResult"},{"type":"null"}]},"cost":{"anyOf":[{"$ref":"#/components/schemas/PercentileResult"},{"type":"null"}]},"completion_date":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Completion Date","description":"Map of p-value strings to ISO completion dates e.g. {'p50': '2027-04-15'}"}},"type":"object","required":["method","trial_count"],"title":"SimulationEnvelope","description":"Probabilistic simulation outputs for Tier 3 endpoints.\n\nNull on all Tier 1 and Tier 2 responses.  When Tier 3 launches, this\nfield transitions from null to populated without changing any other\nenvelope field — existing consumers are unaffected."},"SubMetricWeights":{"properties":{"float_risk":{"type":"number","title":"Float Risk","default":0.3},"logic_risk":{"type":"number","title":"Logic Risk","default":0.25},"baseline_drift_risk":{"type":"number","title":"Baseline Drift Risk","default":0.2},"progress_integrity_risk":{"type":"number","title":"Progress Integrity Risk","default":0.15},"resource_risk":{"type":"number","title":"Resource Risk","default":0.1}},"type":"object","title":"SubMetricWeights","description":"Custom weight overrides for SRI sub-metrics (must sum to 1.0)."},"SubmissionTypeResponse":{"properties":{"type_code":{"type":"string","title":"Type Code","description":"Submission type code"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Submission type description"},"requires_auth":{"type":"boolean","title":"Requires Auth","description":"Whether authentication is required","default":false}},"type":"object","required":["type_code","display_name"],"title":"SubmissionTypeResponse","description":"Response schema for available submission types."},"SystemicIssue":{"properties":{"issue":{"type":"string","title":"Issue"},"description":{"type":"string","title":"Description"},"affected_tasks":{"type":"integer","title":"Affected Tasks"},"recommendation":{"type":"string","title":"Recommendation"}},"type":"object","required":["issue","description","affected_tasks","recommendation"],"title":"SystemicIssue","description":"A systemic cross-band issue."},"Task":{"properties":{"id":{"type":"string","title":"Id","description":"Unique task identifier"},"duration_days":{"type":"number","minimum":0.0,"title":"Duration Days","description":"Task duration in days","default":0},"predecessors":{"items":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"$ref":"#/components/schemas/DependencyLink"}]},"type":"array","title":"Predecessors","description":"List of predecessor task IDs or dependency links. Supports: 'T1', 'T1FS+5 d', 'T2SS-2 d', or DependencyLink objects"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Task name"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource","description":"Resource assigned to task"},"resources":{"items":{"type":"string"},"type":"array","title":"Resources","description":"List of resources assigned (for multi-resource tasks)"},"percent_complete":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Percent Complete","description":"Percent complete (0-100)","default":0},"physical_percent_complete":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Physical Percent Complete","description":"Physical percent complete (0-100). Manual EVM entry by scheduler (MSP PhysicalPercentComplete). Authoritative for BCWP calculations. Captured separately from percent_complete on MSP imports."},"planned_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Planned Start","description":"Planned start date (ISO 8601)"},"planned_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Planned Finish","description":"Planned finish date (ISO 8601)"},"actual_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Actual Start","description":"Actual start date (ISO 8601)"},"actual_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Actual Finish","description":"Actual finish date (ISO 8601)"},"baseline_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Start","description":"Baseline start date (ISO 8601)"},"baseline_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Baseline Finish","description":"Baseline finish date (ISO 8601)"},"constraint_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constraint Type","description":"Constraint type: ASAP, ALAP, SNET, SNLT, FNET, FNLT, MSO, MFO"},"constraint_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Constraint Date","description":"Constraint date if applicable (ISO 8601)"},"task_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Type","description":"Task type classification. Valid values: task (default), milestone, loe, summary, schedule_margin, planning_package, slpp, schedule_visibility. Drives DCMA check exclusions per PAM 200.1 § 3.2."},"wbs_code":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Wbs Code","description":"WBS code (e.g., '1.2.3')"},"organization_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Code","description":"Org/dept identifier for anomaly categorization (Progress Audit)"},"custom_field_map":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Custom Field Map","description":"All WBS/OBS-pattern custom fields discovered in this MS Project file, keyed by alias (e.g., 'CWBS', 'OBS'). Null for XER imports or when no matching aliases exist."},"forecast_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Forecast Start","description":"Current forecast start date (ISO 8601)"},"forecast_finish":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Forecast Finish","description":"Current forecast finish date (ISO 8601)"},"total_float_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Float Days","description":"Pre-computed total float in days. Auto-computed by CPM if absent."},"baseline_duration_days":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Baseline Duration Days","description":"Baseline duration in days. Auto-computed from baseline dates if absent."},"delay_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delay Category","description":"Delay attribution category. Valid values: owner, contractor, design, procurement, weather, force_majeure."},"earned_value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Earned Value","description":"Earned Value (BCWP) in cost units. Requires options.include_ev_validation."},"budgeted_cost":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Budgeted Cost","description":"Budgeted Cost of Work Scheduled (BCWS) in cost units."},"approval_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approval Required","description":"Whether this task requires explicit approval before it can start."},"approval_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approval Status","description":"Approval workflow state. Valid values: not_required, pending, approved, rejected."}},"type":"object","required":["id"],"title":"Task","description":"Unified task model for all schedule analysis endpoints.\n\nThis model is used across all Tier 1 and Tier 2 APIs. Fields are optional\nunless specifically required by an endpoint.\n\nField Naming Rationale:\n- duration_days: Explicit time unit (vs generic \"duration\")\n- predecessors: Standard scheduling terminology (vs generic \"dependencies\")\n\nDependency Format Support:\n- Simple: [\"task1\", \"task2\"]\n- Rich: [\"task1FS+5 d\", \"task2SS-2 d\"]\n- Objects: [DependencyLink(...), ...]","example":{"duration_days":10,"id":"T1","name":"Design Phase","percent_complete":0,"planned_finish":"2026-01-15","planned_start":"2026-01-01","predecessors":[],"resource":"Team A"}},"TaskComparison":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"match_confidence":{"type":"number","title":"Match Confidence","default":1.0},"planned_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Start"},"planned_finish":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Finish"},"planned_duration_days":{"type":"integer","title":"Planned Duration Days","default":0},"actual_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Start"},"actual_finish":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Finish"},"actual_duration_days":{"type":"integer","title":"Actual Duration Days","default":0},"start_variance_days":{"type":"integer","title":"Start Variance Days","default":0},"finish_variance_days":{"type":"integer","title":"Finish Variance Days","default":0},"duration_variance_days":{"type":"integer","title":"Duration Variance Days","default":0},"variance_classification":{"type":"string","enum":["early_completion","on_time","minor_slip","moderate_slip","severe_slip","incomplete"],"title":"Variance Classification","default":"on_time"},"on_planned_critical_path":{"type":"boolean","title":"On Planned Critical Path","default":false},"on_actual_critical_path":{"type":"boolean","title":"On Actual Critical Path","default":false},"critical_path_status":{"type":"string","enum":["maintained","gained_criticality","lost_criticality","not_critical"],"title":"Critical Path Status","default":"not_critical"}},"type":"object","required":["task_id","task_name"],"title":"TaskComparison","description":"Per-task as-planned vs. as-built comparison."},"TaskPrerequisites":{"properties":{"logic":{"$ref":"#/components/schemas/LogicDimensionScore"},"resources":{"$ref":"#/components/schemas/ResourceDimensionScore"},"approvals":{"$ref":"#/components/schemas/ApprovalDimensionScore"},"float":{"$ref":"#/components/schemas/FloatDimensionScore"},"forecast_stability":{"$ref":"#/components/schemas/ForecastStabilityScore"}},"type":"object","title":"TaskPrerequisites","description":"All five readiness dimension scores for a task."},"TaskTiming":{"properties":{"early_start":{"type":"number","title":"Early Start","description":"Early start time"},"early_finish":{"type":"number","title":"Early Finish","description":"Early finish time"},"late_start":{"type":"number","title":"Late Start","description":"Late start time"},"late_finish":{"type":"number","title":"Late Finish","description":"Late finish time"},"total_float":{"type":"number","title":"Total Float","description":"Total float (slack)"},"free_float":{"type":"number","title":"Free Float","description":"Free float"},"is_critical":{"type":"boolean","title":"Is Critical","description":"Whether task is on critical path"},"criticality_index":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Criticality Index","description":"Criticality index (0-1)"}},"type":"object","required":["early_start","early_finish","late_start","late_finish","total_float","free_float","is_critical","criticality_index"],"title":"TaskTiming","description":"Task timing information from CPM calculation."},"TaskVarianceRecord":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"is_critical_path":{"type":"boolean","title":"Is Critical Path","default":false},"start_variance_days":{"type":"integer","title":"Start Variance Days","default":0},"finish_variance_days":{"type":"integer","title":"Finish Variance Days","default":0},"duration_variance_days":{"type":"integer","title":"Duration Variance Days","default":0},"progress_variance_pct":{"type":"number","title":"Progress Variance Pct","default":0.0},"variance_severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Variance Severity","default":"low"},"oos_impact_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Oos Impact Days"},"fuzzy_match_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fuzzy Match Confidence"}},"type":"object","required":["task_id","task_name"],"title":"TaskVarianceRecord","description":"Per-task variance metrics."},"TierCapabilities":{"properties":{"tier1":{"type":"boolean","title":"Tier1","description":"Access to Tier 1 APIs: Health, CPM, Validation."},"forensics":{"type":"boolean","title":"Forensics","description":"Access to Tier 2 forensics: Logic Audit, Progress Audit, DCMA 14-Point, DCMA DECM, Resource Analysis."},"import":{"type":"boolean","title":"Import","description":"Access to Import APIs: MPP and XER file parsing."},"risk":{"type":"boolean","title":"Risk","description":"Access to Tier 3 Risk & Simulation APIs (v0.3.0+)."},"async":{"type":"boolean","title":"Async","description":"Async job submission available. True for Starter and above."},"webhooks":{"type":"boolean","title":"Webhooks","description":"Webhook callback registration supported. Same tier gate as async."},"sandbox_fixture_requests":{"type":"boolean","title":"Sandbox Fixture Requests","description":"Sandbox fixture request system available. False for Demo tier only."}},"type":"object","required":["tier1","forensics","import","risk","async","webhooks","sandbox_fixture_requests"],"title":"TierCapabilities","description":"Boolean feature flags for dashboard gating.\n\nThe 'async' and 'import' JSON keys are Python reserved words.\nThey are declared as 'async_jobs' and 'import_api' with serialization_alias\nset so the JSON output uses the correct names ('async' and 'import').\nConstruct from Python using async_jobs=True and import_api=True.\n\nAttributes:\n    tier1: Access to Tier 1 APIs: Health Score, CPM, Validation.\n    forensics: Access to Tier 2 forensics endpoints.\n    import_api: Access to Import APIs (MPP, XER). JSON key: \"import\".\n    risk: Access to Tier 3 Risk & Simulation APIs (v0.3.0+).\n    async_jobs: Async job submission available (Starter+). JSON key: \"async\".\n    webhooks: Webhook callback registration supported.\n    sandbox_fixture_requests: Sandbox fixture system available."},"TierLimits":{"properties":{"sync_task_limit":{"type":"integer","title":"Sync Task Limit","description":"Maximum tasks per synchronous request. Always 1,000 for all tiers."},"max_task_limit":{"type":"integer","title":"Max Task Limit","description":"Maximum tasks per request across sync + async combined. Tier-dependent."},"payload_limit_mb":{"type":"integer","title":"Payload Limit Mb","description":"Maximum request payload size in MB."},"api_calls_per_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Api Calls Per Month","description":"Monthly API call quota. Null for unlimited tiers (Enterprise, Government)."},"monthly_calls_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Calls Remaining","description":"Remaining calls this billing month. Null if Redis unavailable or tier is unlimited."}},"type":"object","required":["sync_task_limit","max_task_limit","payload_limit_mb"],"title":"TierLimits","description":"Numeric limits for the authenticated tier.\n\nAttributes:\n    sync_task_limit: Maximum tasks per synchronous request. Always 1,000.\n    max_task_limit: Maximum tasks per request across sync + async combined.\n    payload_limit_mb: Maximum request payload size in megabytes.\n    api_calls_per_month: Monthly API call quota. Null for unlimited tiers.\n    monthly_calls_remaining: Remaining calls this month from Redis.\n        Null if Redis unavailable or tier is unlimited."},"TopRisk":{"properties":{"task_id":{"type":"string","title":"Task Id"},"risk_description":{"type":"string","title":"Risk Description"},"days_until_start":{"type":"integer","title":"Days Until Start"},"readiness_score":{"type":"number","title":"Readiness Score"},"impact":{"type":"string","enum":["critical","high","medium","low"],"title":"Impact"}},"type":"object","required":["task_id","risk_description","days_until_start","readiness_score","impact"],"title":"TopRisk","description":"Summary of a top at-risk task within a band."},"TrendIndicators":{"properties":{"variance_trend":{"type":"string","enum":["improving","stable","declining"],"title":"Variance Trend","default":"stable"},"bei_trend":{"type":"string","enum":["improving","stable","declining"],"title":"Bei Trend","default":"stable"},"spi_trend":{"type":"string","enum":["improving","stable","declining"],"title":"Spi Trend","default":"stable"},"variance_acceleration":{"type":"number","title":"Variance Acceleration","default":0.0},"projected_completion_variance":{"type":"number","title":"Projected Completion Variance","default":0.0}},"type":"object","title":"TrendIndicators","description":"Aggregate trend direction for variance/BEI/SPI."},"TrendPattern":{"properties":{"pattern":{"type":"string","title":"Pattern"},"description":{"type":"string","title":"Description"},"affected_tasks":{"type":"integer","title":"Affected Tasks"},"first_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Detected"},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity"}},"type":"object","required":["pattern","description","affected_tasks","severity"],"title":"TrendPattern","description":"An identified systemic trend pattern."},"UnmatchedBuiltTask":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"actual_start":{"type":"string","title":"Actual Start","default":""},"actual_finish":{"type":"string","title":"Actual Finish","default":""},"reason":{"type":"string","title":"Reason","default":"added_during_execution"}},"type":"object","required":["task_id","task_name"],"title":"UnmatchedBuiltTask","description":"An as-built task with no as-planned counterpart."},"UnmatchedPlannedTask":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"planned_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Start"},"planned_finish":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Finish"},"reason":{"type":"string","title":"Reason","default":"not_executed"}},"type":"object","required":["task_id","task_name"],"title":"UnmatchedPlannedTask","description":"An as-planned task with no as-built counterpart."},"UnresourcedTask":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"duration_days":{"type":"number","title":"Duration Days"},"on_critical_path":{"type":"boolean","title":"On Critical Path"}},"type":"object","required":["task_id","task_name","duration_days","on_critical_path"],"title":"UnresourcedTask","description":"A task with no resource assignment."},"UpdateAPIKeyLabelRequest":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label","description":"Human-readable label (null to clear)"}},"type":"object","title":"UpdateAPIKeyLabelRequest","description":"Request to update an API key's label."},"UsageKeyDetailResponse":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"API key UUID"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Visible key prefix"},"period":{"$ref":"#/components/schemas/UsagePeriod","description":"Current billing period"},"totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totals","description":"Aggregated totals for the key"},"endpoint_breakdown":{"items":{"$ref":"#/components/schemas/KeyEndpointUsage"},"type":"array","title":"Endpoint Breakdown"},"hourly":{"items":{"$ref":"#/components/schemas/KeyHourlyUsage"},"type":"array","title":"Hourly"}},"type":"object","required":["key_id","key_prefix","period","totals"],"title":"UsageKeyDetailResponse","description":"Detailed usage for a specific API key in the current month."},"UsageMeResponse":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User ID"},"tier":{"type":"string","title":"Tier","description":"Current account tier"},"period":{"$ref":"#/components/schemas/UsagePeriod","description":"Current billing period"},"task_telemetry":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]},"type":"object","title":"Task Telemetry","description":"Task analytics (informational, not a monthly quota gate)"},"calls":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]},"type":"object","title":"Calls","description":"Call quota usage and percentage"},"keys":{"items":{"$ref":"#/components/schemas/KeyUsageSummary"},"type":"array","title":"Keys","description":"Per-key breakdown"},"warnings":{"items":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]},"type":"object"},"type":"array","title":"Warnings","description":"Quota warning objects (70%/90% thresholds)"}},"type":"object","required":["user_id","tier","period","calls"],"title":"UsageMeResponse","description":"Response for GET /api/v1/usage/me — current user's aggregate usage."},"UsagePeriod":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Period start (UTC)"},"end":{"type":"string","format":"date-time","title":"End","description":"Period end (UTC)"}},"type":"object","required":["start","end"],"title":"UsagePeriod","description":"Billing period window (UTC month boundaries)."},"UserProfileResponse":{"properties":{"email":{"type":"string","title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"}},"type":"object","required":["email"],"title":"UserProfileResponse","description":"Authenticated user profile details for UX prefill."},"UserSignupRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email (ignored - using OAuth token)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User display name"},"tier":{"$ref":"#/components/schemas/APITier","description":"Initial API tier (default: free)","default":"free"}},"type":"object","title":"UserSignupRequest","description":"User signup request.\n\nFor OAuth-authenticated signups, email is extracted from validated token.\nRequest body is optional and used only for additional metadata."},"UserSignupResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"account_created":{"type":"boolean","title":"Account Created"}},"type":"object","required":["user_id","email","account_created"],"title":"UserSignupResponse","description":"Signup response without automatic API key creation."},"ValidationData":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"Whether the schedule is valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"List of validation errors"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"List of validation warnings"},"probability_of_performance":{"anyOf":[{"$ref":"#/components/schemas/ProbabilityOfPerformance"},{"type":"null"}],"description":"Probability of Performance (present when calculate_pop=true)"}},"type":"object","required":["valid"],"title":"ValidationData","description":"Data payload for POST /api/v1/schedule/validate."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationOptions":{"properties":{"calculate_pop":{"type":"boolean","title":"Calculate Pop","description":"Calculate Probability of Performance (PoP) score (v0.2.0).","default":false},"include_pop_details":{"type":"boolean","title":"Include Pop Details","description":"Include dimensional PoP breakdown in response.","default":true},"strict_mode":{"type":"boolean","title":"Strict Mode","description":"Treat warnings as errors (fail validation on any issue).","default":false},"check_dcma_compliance":{"type":"boolean","title":"Check Dcma Compliance","description":"Include DCMA-specific checks (#1, #8).","default":true}},"type":"object","title":"ValidationOptions","description":"Options for POST /api/v1/schedule/validate (v0.2.0)."},"VarianceFinding":{"properties":{"finding_type":{"type":"string","title":"Finding Type"},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity"},"affected_tasks":{"type":"integer","title":"Affected Tasks","default":0},"total_variance_days":{"type":"number","title":"Total Variance Days","default":0.0},"description":{"type":"string","title":"Description","default":""},"tasks":{"items":{"type":"string"},"type":"array","title":"Tasks"}},"type":"object","required":["finding_type","severity"],"title":"VarianceFinding","description":"A significant variance pattern finding."},"VariancePattern":{"properties":{"pattern_type":{"type":"string","title":"Pattern Type"},"description":{"type":"string","title":"Description","default":""},"confidence":{"type":"number","title":"Confidence","default":0.0}},"type":"object","required":["pattern_type"],"title":"VariancePattern","description":"Identified variance pattern."},"VarianceTrendPeriod":{"properties":{"period_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Date"},"total_variance_days":{"type":"number","title":"Total Variance Days","default":0.0},"bei":{"type":"number","title":"Bei","default":1.0},"spi_schedule":{"type":"number","title":"Spi Schedule","default":1.0},"critical_path_variance_days":{"type":"number","title":"Critical Path Variance Days","default":0.0}},"type":"object","title":"VarianceTrendPeriod","description":"Variance metrics for a single historical period."},"VarianceTrends":{"properties":{"periods":{"items":{"$ref":"#/components/schemas/VarianceTrendPeriod"},"type":"array","title":"Periods"},"trend_indicators":{"$ref":"#/components/schemas/TrendIndicators"},"identified_patterns":{"items":{"$ref":"#/components/schemas/VariancePattern"},"type":"array","title":"Identified Patterns"},"chart_data":{"anyOf":[{"$ref":"#/components/schemas/BaselineChartData"},{"type":"null"}]}},"type":"object","title":"VarianceTrends","description":"Multi-period variance trend analysis."},"WaitlistTypeResponse":{"properties":{"type_code":{"type":"string","title":"Type Code","description":"Waitlist type code"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable display name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Waitlist type description"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether waitlist is accepting signups","default":true}},"type":"object","required":["type_code","display_name"],"title":"WaitlistTypeResponse","description":"Response schema for available waitlist types."},"WebhookRegistration":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"Webhook callback URL"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Events to trigger webhook"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Shared secret for webhook signature validation"}},"type":"object","required":["url"],"title":"WebhookRegistration","description":"Model for webhook callback registration.","example":{"events":["job.completed","job.failed"],"secret":"whsec_abc123","url":"https://customer.example.com/webhooks/bellator"}},"XerImportOptions":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"Select a specific project from a multi-project XER. Required if XER contains more than one project."},"strict_validation":{"type":"boolean","title":"Strict Validation","default":true},"auto_detect_start_finish":{"type":"boolean","title":"Auto Detect Start Finish","default":true},"auto_classify_task_types":{"type":"boolean","title":"Auto Classify Task Types","default":true},"use_prefix_classification":{"type":"boolean","title":"Use Prefix Classification","description":"Detect task type from name prefix (e.g., 'SM-Buffer', 'PP-FuturePh3', 'AE-Engineering'). Fires only when native P6 task_type is not already set. See Import API Common Patterns § Prefix Classification.","default":true},"include_warnings":{"type":"boolean","title":"Include Warnings","default":true},"use_activity_id":{"type":"boolean","title":"Use Activity Id","description":"Use task_code (Activity ID) as task id instead of numeric task_id.","default":false}},"type":"object","title":"XerImportOptions","description":"Options controlling P6 XER import behavior."},"XerImportRequest":{"properties":{"file_content":{"type":"string","title":"File Content","description":"P6 XER file content (text, any encoding — auto-detected)"},"options":{"$ref":"#/components/schemas/XerImportOptions"}},"type":"object","required":["file_content"],"title":"XerImportRequest","description":"Request model for POST /api/v1/import/xer."},"app__api__v1__schedule_analysis__cpm__ProcessingMetadata":{"properties":{"processing_time_ms":{"type":"number","title":"Processing Time Ms","description":"Processing time in milliseconds"},"algorithm_version":{"type":"string","title":"Algorithm Version","description":"CPM algorithm version"}},"type":"object","required":["processing_time_ms","algorithm_version"],"title":"ProcessingMetadata","description":"Processing metadata."},"app__models__schemas__ProcessingMetadata":{"properties":{"import_timestamp":{"type":"string","title":"Import Timestamp","description":"ISO 8601 timestamp"},"processing_time_ms":{"type":"number","minimum":0.0,"title":"Processing Time Ms"},"api_version":{"type":"string","title":"Api Version","default":"v0.2.0"},"parser_version":{"type":"string","title":"Parser Version"}},"type":"object","required":["import_timestamp","processing_time_ms","parser_version"],"title":"ProcessingMetadata","description":"Timing and version metadata for an import operation."},"app__models__schemas__ProgressAnomaly__1":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"anomaly_type":{"type":"string","title":"Anomaly Type"},"snapshot_date":{"type":"string","title":"Snapshot Date"},"previous_pct":{"type":"number","title":"Previous Pct"},"current_pct":{"type":"number","title":"Current Pct"},"delta_pct":{"type":"number","title":"Delta Pct"},"is_material":{"type":"boolean","title":"Is Material","default":true},"explanation":{"type":"string","title":"Explanation"}},"type":"object","required":["task_id","task_name","anomaly_type","snapshot_date","previous_pct","current_pct","delta_pct","explanation"],"title":"ProgressAnomaly","description":"A progress anomaly detected during change tracking."},"app__models__schemas__ProgressAnomaly__2":{"properties":{"type":{"type":"string","title":"Type","description":"Anomaly category code (e.g. 'future_actuals')"},"severity":{"type":"string","enum":["critical","high","medium","low"],"title":"Severity","description":"Anomaly severity level"},"task_id":{"type":"string","title":"Task Id","description":"ID of the affected task"},"predecessor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predecessor Id","description":"Predecessor task ID (OOS anomalies only)"},"message":{"type":"string","title":"Message","description":"Human-readable anomaly description"},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Raw anomaly detail fields"},"standard_reference":{"type":"string","title":"Standard Reference","description":"Applicable standard reference (e.g. 'DCMA Check #9')","default":""},"remediation":{"type":"string","title":"Remediation","description":"Suggested corrective action","default":""}},"type":"object","required":["type","severity","task_id","message"],"title":"ProgressAnomaly","description":"A single detected progress integrity anomaly."},"app__models__schemas__ResourceAvailability__1":{"properties":{"resource_name":{"type":"string","title":"Resource Name","description":"Resource name (must match tasks[*].resources)"},"available_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available From","description":"Start of availability window (ISO 8601). Null = project start."},"available_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available To","description":"End of availability window (ISO 8601). Null = project finish."},"units_per_day":{"type":"number","minimum":0.0,"title":"Units Per Day","description":"Available resource-units per working day (default: 1.0 = 100%)","default":1.0}},"type":"object","required":["resource_name"],"title":"ResourceAvailability","description":"Per-resource availability window for Resource Analysis.\n\nSpecifies how many units of a resource are available over a date range.\nresource_name must match a value appearing in tasks[*].resources."},"app__models__schemas__ResourceAvailability__2":{"properties":{"resource_name":{"type":"string","title":"Resource Name","description":"Resource name (must match task resource fields)"},"units_per_day":{"type":"number","exclusiveMinimum":0.0,"title":"Units Per Day","description":"Available units per day","default":1.0},"available_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available From","description":"Availability start date (ISO 8601)"},"available_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Available To","description":"Availability end date (ISO 8601)"}},"type":"object","required":["resource_name"],"title":"ResourceAvailability","description":"Declared capacity for a named resource."}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key for authentication. Required when API_KEY is configured."},"OAuth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token","scopes":{"api.read":"Read access to API","api.write":"Write access to API"}}},"description":"OAuth 2.0 / Azure AD authentication (recommended)"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT Bearer token from OAuth 2.0 / Azure AD"}}}}