openapi: 3.1.0 info: contact: email: felixtj.dietrich@tum.de name: Felix T.J. Dietrich description: API documentation for Hephaestus. Practice review bigint ids and monetary amounts are decimal strings. Monetary fields are USD; clients read server-computed totals and budget decisions. Provider mirror ids retain their numeric contract. Required nullable response fields are present with null. license: name: MIT License url: https://github.com/hephaestus-build/Hephaestus/blob/main/LICENSE title: Hephaestus API version: 0.0.0-development servers: - description: Default Server URL url: / security: - bearerAuth: [] tags: - description: The current developer's practice profile name: Practice Profile - description: The authenticated developer's feedback name: Practice feedback - description: Per-workspace LLM spend rollup and budget status name: LLM Usage - description: Workspace-scoped mentor chat threads name: Mentor Threads - description: Running release identity and update checks name: Instance Release - description: The current developer's standing in each practice name: Practice Standings - description: Recipient responses to delivered practice feedback name: Feedback Response - description: Heph conversations and the sandbox they run in name: Mentor Chat - description: "User account management (settings, deletion)" name: Account - description: Instance-admin account management name: Admin - description: Current user's Slack privacy preferences name: Slack User Preferences - description: Per-workspace Outline collection mirroring control plane name: Outline collections - description: Why each practice did or did not run on one piece of work. Any workspace member can read it. name: Practice review trace - description: Instance-wide operator settings name: Instance Settings - description: Session lifecycle name: Auth - description: Workspace-scoped practice-review policy name: Practice Review Settings - description: Instance-admin-only read-only access to users name: User view - description: Review catalog changes before they affect a workspace name: Practice Catalog - description: Workspace integration connection management name: Connections - description: Up/down votes on mentor assistant messages name: Mentor Votes - description: "Workspace-admin access to reviews, results, and feedback delivery\ \ history" name: Practice reviews - description: GDPR Art. 20 self-service data export name: Account - description: Instance-administrator access and erasure requests name: Person Data - description: Workspace-scoped history of admin configuration changes name: Config Audit - description: |- Vendor OAuth redirect ingress at /oauth/callback/{kind}. Unauthenticated — identity comes from the HMAC-signed state param. Browsers get 302 redirects on both success and failure; only Accept: application/json requests get 4xx JSON. name: o-auth-callback-controller - description: Redacted production configuration facts name: Configuration Readiness - description: Identity provider discovery (public) name: Auth discovery - description: Read-only access to practice evaluation results name: Practice Results - description: Global contributor information name: Contributors - description: User preferences name: Account - description: Instance-admin login provider management name: Admin - description: Per-workspace Slack channel consent + activation name: Slack channel activation - description: "Sign-in, refresh and sign-out for installed clients" name: Client session - description: Workspace-scoped per-purpose agent configuration name: Agents - description: The current developer's standing in each practice group name: Practice Group Standings - description: Asking for a review of a piece of work by hand name: Practice review requests - description: Current account transparency and research consent name: Consent - description: Adopt instance catalog practices into a workspace name: Practice Catalog Adoption - description: Team management within workspace name: Teams - description: Instance-wide email transport verification name: Instance Email - description: "Workspace-scoped \"bring your own\" AI provider connections, models\ \ and settings" name: Workspace LLM - description: Active sessions name: Account - description: |- GitLab-specific REST endpoints used during the workspace creation wizard. Gated on the GITLAB_WORKSPACE_CREATION feature flag. name: git-lab-preflight-controller - description: Instance-admin LLM connection and settings management name: Admin LLM - description: Public JWK set for verifying Hephaestus session JWTs name: Auth discovery - description: Workspace-scoped team settings management name: Team Settings - description: Repository contributions and open work name: Activity - description: Integration sync observability and manual controls name: Sync - description: "Current user identity, linked accounts, deletion" name: Account paths: /.well-known/jwks.json: get: operationId: getJwks responses: "200": content: application/json: schema: type: object additionalProperties: {} description: OK summary: JWK set (public keys only) tags: - Auth discovery /admin/audit: get: operationId: adminListAuthEvents parameters: - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 50 - in: query name: accountId required: false schema: type: integer format: int64 - in: query name: actingAccountId required: false schema: type: integer format: int64 - in: query name: eventType required: false schema: type: array items: type: string enum: - USER_VIEW - LOGIN - LOGIN_FAILED - LOGOUT - TOKEN_REFRESH - JWT_REVOKED - IDENTITY_LINKED - IDENTITY_UNLINKED - IMPERSONATION_BEGIN - IMPERSONATION_END - ACCOUNT_DELETED - EXPORT_REQUESTED - PERSON_DATA_PREVIEWED - PERSON_DATA_EXPORTED - PERSON_DATA_ERASURE_REQUESTED - APP_ROLE_CHANGED - RESEARCH_CONSENT_REVOKED - WORKSPACE_ELEVATION - LLM_CONNECTION_CREATED - LLM_CONNECTION_UPDATED - LLM_CONNECTION_DELETED - LLM_MODEL_CREATED - LLM_MODEL_UPDATED - LLM_MODEL_DELETED - LLM_MODEL_PRICE_CHANGED - LLM_MODEL_SHARING_CHANGED - LLM_SETTINGS_CHANGED - LOGIN_PROVIDER_CREATED - LOGIN_PROVIDER_UPDATED - LOGIN_PROVIDER_DELETED - SILENT_MODE_CHANGED - PUBLIC_ACTIVITY_CHANGED - in: query name: result required: false schema: type: array items: type: string enum: - SUCCESS - FAILURE - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOAuthEventView" description: OK summary: "List auth audit events (paged, newest first)" tags: - Admin /admin/audit/export: get: operationId: adminExportAuthEvents parameters: - in: query name: accountId required: false schema: type: integer format: int64 - in: query name: actingAccountId required: false schema: type: integer format: int64 - in: query name: eventType required: false schema: type: array items: type: string enum: - USER_VIEW - LOGIN - LOGIN_FAILED - LOGOUT - TOKEN_REFRESH - JWT_REVOKED - IDENTITY_LINKED - IDENTITY_UNLINKED - IMPERSONATION_BEGIN - IMPERSONATION_END - ACCOUNT_DELETED - EXPORT_REQUESTED - PERSON_DATA_PREVIEWED - PERSON_DATA_EXPORTED - PERSON_DATA_ERASURE_REQUESTED - APP_ROLE_CHANGED - RESEARCH_CONSENT_REVOKED - WORKSPACE_ELEVATION - LLM_CONNECTION_CREATED - LLM_CONNECTION_UPDATED - LLM_CONNECTION_DELETED - LLM_MODEL_CREATED - LLM_MODEL_UPDATED - LLM_MODEL_DELETED - LLM_MODEL_PRICE_CHANGED - LLM_MODEL_SHARING_CHANGED - LLM_SETTINGS_CHANGED - LOGIN_PROVIDER_CREATED - LOGIN_PROVIDER_UPDATED - LOGIN_PROVIDER_DELETED - SILENT_MODE_CHANGED - PUBLIC_ACTIVITY_CHANGED - in: query name: result required: false schema: type: array items: type: string enum: - SUCCESS - FAILURE - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: text/csv: schema: type: string description: OK summary: "Export the filtered audit log as CSV (newest first, capped)" tags: - Admin /admin/config-audit: get: operationId: adminListConfigAuditEvents parameters: - in: query name: workspaceId required: false schema: type: integer format: int64 - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 50 - in: query name: entityType required: false schema: type: array items: type: string enum: - PRACTICE_REVIEW_SETTINGS - AGENT_BINDING - AGENT_CONFIG - AI_CONFIG_BINDING - WORKSPACE_ROLE - ACTIVITY_AUTOMATION - WORKSPACE_FEATURES - WORKSPACE_STATUS - WORKSPACE_TOKEN - WORKSPACE_VISIBILITY - PRACTICE_ACTIVE - PRACTICE_USAGE - PRACTICE_DEFINITION - PRACTICE_GROUP - CATALOG_PRACTICE - CATALOG_GROUP - WORKSPACE_INSTANCE_LLM_BUDGET - WORKSPACE_OWN_PROVIDER_LLM_BUDGET - WORKSPACE_LLM_BUDGET - WORKSPACE_BYO_LLM_BUDGET - REVIEW_BATCH - REVIEW_SCHEDULE - FEEDBACK_DELIVERY_RECHECK - WORKSPACE_LLM_CONNECTION - WORKSPACE_LLM_MODEL - in: query name: entityId required: false schema: type: string - in: query name: changedKey required: false schema: type: string - in: query name: action required: false schema: type: array items: type: string enum: - CREATED - UPDATED - DELETED - in: query name: actorId required: false schema: type: integer format: int64 - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOConfigAuditEntryView" description: OK summary: "List admin configuration changes across workspaces (paged, newest\ \ first)" tags: - Admin /admin/configuration-readiness: get: operationId: adminGetConfigurationReadiness responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ConfigurationFact" description: OK summary: Get redacted configuration readiness tags: - Configuration Readiness /admin/email/test: post: description: "Sends a test email through the configured relay to the given address,\ \ or to the caller's verified address when none is given." operationId: adminSendTestEmail requestBody: content: application/json: schema: $ref: "#/components/schemas/EmailTestRequest" responses: "200": content: application/json: schema: $ref: "#/components/schemas/EmailTestResponse" description: Email delivery outcome "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Malformed request or invalid recipient address summary: Send a test email tags: - Instance Email /admin/llm/connections: get: operationId: adminListLlmConnections responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/LlmConnection" description: OK summary: List LLM connections tags: - Admin LLM post: operationId: adminCreateLlmConnection requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateLlmConnectionRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/LlmConnection" description: Connection created; URL in the Location header "409": description: An LLM connection with this slug already exists summary: Create an LLM connection tags: - Admin LLM /admin/llm/connections/probe: post: operationId: adminProbeLlmConnectionDraft requestBody: content: application/json: schema: $ref: "#/components/schemas/ProbeLlmConnectionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmProbeResult" description: OK summary: Test a draft connection and fetch its models tags: - Admin LLM /admin/llm/connections/{connectionId}/models: post: operationId: adminCreateLlmModel parameters: - in: path name: connectionId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateLlmModelRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/LlmModel" description: Model created; URL in the Location header "404": description: LLM connection not found "409": description: A model with this slug or upstream model id already exists on the connection summary: Create a model on an LLM connection tags: - Admin LLM /admin/llm/connections/{id}: delete: operationId: adminDeleteLlmConnection parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "204": description: Connection deleted "404": description: LLM connection not found "409": description: Cannot delete a connection still referenced by one or more models summary: Delete an LLM connection tags: - Admin LLM get: operationId: adminGetLlmConnection parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmConnection" description: OK "404": description: LLM connection not found summary: Get an LLM connection tags: - Admin LLM patch: operationId: adminUpdateLlmConnection parameters: - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmConnectionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmConnection" description: OK "404": description: LLM connection not found summary: Update an LLM connection tags: - Admin LLM /admin/llm/connections/{id}/probe: post: operationId: adminProbeLlmConnection parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmProbeResult" description: OK summary: Test a stored connection and fetch its models tags: - Admin LLM /admin/llm/models: get: operationId: adminListLlmModels responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/LlmModel" description: OK summary: List LLM catalog models tags: - Admin LLM /admin/llm/models/{id}: delete: operationId: adminDeleteLlmModel parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "204": description: Model deleted "404": description: LLM model not found "409": description: Cannot delete a model still bound to an agent configuration summary: Delete an LLM catalog model tags: - Admin LLM get: operationId: adminGetLlmModel parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmModel" description: OK "404": description: LLM model not found summary: Get an LLM catalog model tags: - Admin LLM patch: operationId: adminUpdateLlmModel parameters: - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmModelRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmModel" description: OK "404": description: LLM model not found "409": description: Another model on the connection already uses this upstream model id summary: Update a model's metadata tags: - Admin LLM /admin/llm/models/{id}/price: put: operationId: adminUpdateLlmModelPrice parameters: - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmModelPriceRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmModel" description: OK "404": description: LLM model not found summary: Reprice a model tags: - Admin LLM /admin/llm/models/{id}/sharing: put: operationId: adminUpdateLlmModelSharing parameters: - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmModelSharingRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LlmModel" description: OK "404": description: LLM model not found summary: Share a model with all or selected workspaces tags: - Admin LLM /admin/llm/settings: get: operationId: adminGetLlmSettings responses: "200": content: application/json: schema: $ref: "#/components/schemas/InstanceLlmSettings" description: OK summary: Get instance-wide LLM governance settings tags: - Admin LLM put: operationId: adminUpdateLlmSettings requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateInstanceLlmSettingsRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/InstanceLlmSettings" description: OK summary: Update instance-wide LLM governance settings tags: - Admin LLM /admin/llm/usage: get: operationId: adminGetLlmUsageReport parameters: - in: query name: month required: false schema: type: string pattern: "\\d{4}-(0[1-9]|1[0-2])" responses: "200": content: application/json: schema: $ref: "#/components/schemas/AdminLlmUsageReport" description: OK summary: Per-workspace LLM spend rollup for one month (all workspaces) tags: - Admin /admin/login-providers: get: operationId: adminListLoginProviders responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/LoginProviderView" description: OK summary: List login providers tags: - Admin post: operationId: adminCreateLoginProvider requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateLoginProviderRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/LoginProviderView" description: Login provider created; URL in the Location header summary: Create a login provider tags: - Admin /admin/login-providers/{registrationId}: delete: operationId: adminDeleteLoginProvider parameters: - in: path name: registrationId required: true schema: type: string responses: "200": description: OK summary: Delete a login provider tags: - Admin patch: operationId: adminUpdateLoginProvider parameters: - in: path name: registrationId required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLoginProviderRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/LoginProviderView" description: OK summary: Update a login provider tags: - Admin /admin/person-data/preview: post: operationId: adminPreviewPersonData requestBody: content: application/json: schema: $ref: "#/components/schemas/PreviewRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PersonDataRequest" description: OK summary: Resolve exact identities and preview every personal-data store tags: - Person Data /admin/person-data/providers: get: operationId: adminListPersonDataProviders responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PersonDataProvider" description: OK summary: List exact provider instances without credentials tags: - Person Data /admin/person-data/{id}: get: operationId: adminGetPersonDataRequest parameters: - in: path name: id required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/PersonDataRequest" description: OK summary: Get a person-data preview or erasure receipt tags: - Person Data /admin/person-data/{id}/erase: post: operationId: adminErasePersonData parameters: - in: path name: id required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/ErasureRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PersonDataRequest" description: OK summary: Start or resume the preview's audited erasure job tags: - Person Data /admin/person-data/{id}/export: post: operationId: adminExportPersonData parameters: - in: path name: id required: true schema: type: string format: uuid responses: "200": content: application/json: schema: type: string format: binary description: JSON file summary: Download the preview's frozen scope as one JSON file tags: - Person Data /admin/practice-catalog: get: operationId: getInstanceCatalog responses: "200": content: application/json: schema: $ref: "#/components/schemas/Catalog" description: OK tags: - catalog-admin /admin/practice-catalog/definition-options: get: operationId: getInstanceDefinitionOptions responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeDefinitionOptions" description: OK tags: - catalog-admin /admin/practice-catalog/groups: post: operationId: createCatalogGroup requestBody: content: application/json: schema: $ref: "#/components/schemas/CatalogGroupInput" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroup" description: OK tags: - catalog-admin /admin/practice-catalog/groups/reorder: patch: operationId: reorderCatalogGroups parameters: - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/ReorderRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Catalog" description: OK tags: - catalog-admin /admin/practice-catalog/groups/{slug}: get: operationId: getCatalogGroup parameters: - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroup" description: OK tags: - catalog-admin put: operationId: updateCatalogGroup parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/CatalogGroupUpdate" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroup" description: OK tags: - catalog-admin /admin/practice-catalog/groups/{slug}/override: delete: operationId: resetCatalogGroup parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroup" description: OK tags: - catalog-admin /admin/practice-catalog/groups/{slug}/override/acknowledgement: put: operationId: acknowledgeCatalogGroup parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroup" description: OK tags: - catalog-admin /admin/practice-catalog/groups/{slug}/status: patch: operationId: setCatalogGroupStatus parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/SetCatalogStatusRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Catalog" description: OK tags: - catalog-admin /admin/practice-catalog/order: delete: operationId: resetCatalogOrder parameters: - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/Catalog" description: OK tags: - catalog-admin /admin/practice-catalog/practices: post: operationId: createCatalogPractice requestBody: content: application/json: schema: $ref: "#/components/schemas/CatalogPracticeInput" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}: get: operationId: getCatalogPractice parameters: - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin put: operationId: updateCatalogPractice parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/CatalogPracticeUpdate" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}/group: patch: operationId: moveCatalogPractice parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/MovePracticeRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Catalog" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}/override: delete: operationId: resetCatalogPractice parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}/override/acknowledgement: put: operationId: acknowledgeCatalogPractice parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}/release: get: operationId: getCatalogPracticeRelease parameters: - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeReleaseProposal" description: OK tags: - catalog-admin put: operationId: acceptCatalogPracticeRelease parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/AcceptPracticeReleaseRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/practice-catalog/practices/{slug}/status: patch: operationId: setCatalogPracticeStatus parameters: - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/SetCatalogStatusRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPractice" description: OK tags: - catalog-admin /admin/product-feedback: get: operationId: adminListProductFeedback parameters: - in: query name: status required: false schema: type: string default: OPEN enum: - OPEN - RESOLVED - ALL - description: Zero-based page index (0..N) in: query name: page required: false schema: type: integer default: 0 minimum: 0 - description: The size of the page to be returned in: query name: size required: false schema: type: integer default: 50 minimum: 1 - description: "Sorting criteria in the format: property,(asc|desc). Default\ \ sort order is ascending. Multiple sort criteria are supported." in: query name: sort required: false schema: type: array items: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PagedModelFeedbackItem" description: OK summary: "List product feedback, newest first" tags: - feedback-admin /admin/product-feedback/surveys: get: operationId: adminListProductSurveys parameters: - description: Zero-based page index (0..N) in: query name: page required: false schema: type: integer default: 0 minimum: 0 - description: The size of the page to be returned in: query name: size required: false schema: type: integer default: 50 minimum: 1 - description: "Sorting criteria in the format: property,(asc|desc). Default\ \ sort order is ascending. Multiple sort criteria are supported." in: query name: sort required: false schema: type: array default: - "createdAt,DESC" items: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PagedModelSurvey" description: OK summary: List product surveys with participation counts tags: - survey-admin post: operationId: adminCreateProductSurvey requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateSurvey" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Survey" description: OK summary: Publish a product survey tags: - survey-admin /admin/product-feedback/surveys/{surveyId}: delete: operationId: adminDeleteProductSurvey parameters: - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": description: OK summary: Delete a survey and every response to it tags: - survey-admin get: operationId: adminGetProductSurvey parameters: - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/Survey" description: OK summary: Read one product survey tags: - survey-admin put: operationId: adminUpdateProductSurvey parameters: - in: path name: surveyId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/SurveyEdit" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Survey" description: OK summary: "Edit a survey's title, purpose, schedule or pause state" tags: - survey-admin /admin/product-feedback/surveys/{surveyId}/email-invitations: get: operationId: adminPreviewSurveyEmailInvitations parameters: - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/SurveyEmailInvitationSummary" description: OK summary: Preview eligible survey email recipients and relay acceptance counts tags: - survey-admin post: operationId: adminSendSurveyEmailInvitations parameters: - in: path name: surveyId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/SurveyEmailInvitationRequest" responses: "200": content: application/json: schema: $ref: "#/components/schemas/SurveyEmailInvitationSummary" description: Invitation request summary "503": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Email delivery is not configured; no invitations were requested summary: Queue up to 1000 new or explicitly retried cancelled survey email invitations tags: - survey-admin /admin/product-feedback/surveys/{surveyId}/responses: get: operationId: adminListProductSurveyResponses parameters: - in: path name: surveyId required: true schema: type: string format: uuid - description: Zero-based page index (0..N) in: query name: page required: false schema: type: integer default: 0 minimum: 0 - description: The size of the page to be returned in: query name: size required: false schema: type: integer default: 50 minimum: 1 - description: "Sorting criteria in the format: property,(asc|desc). Default\ \ sort order is ascending. Multiple sort criteria are supported." in: query name: sort required: false schema: type: array items: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PagedModelSurveyResponse" description: OK summary: "List responses and declines, newest first" tags: - survey-admin /admin/product-feedback/surveys/{surveyId}/responses/export: get: operationId: adminExportProductSurveyResponses parameters: - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": content: text/csv: schema: type: string description: OK summary: Export responses and declines as CSV tags: - survey-admin /admin/product-feedback/surveys/{surveyId}/summary: get: operationId: adminGetProductSurveySummary parameters: - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/SurveySummary" description: OK summary: Aggregate the responses per question tags: - survey-admin /admin/product-feedback/{feedbackId}: patch: operationId: adminTriageProductFeedback parameters: - in: path name: feedbackId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/FeedbackTriage" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackItem" description: OK summary: Mark product feedback as resolved or reopen it tags: - feedback-admin /admin/release: get: operationId: adminGetRelease responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReleaseStatus" description: OK summary: Get the running release and the last update check tags: - Instance Release /admin/release/checks: post: operationId: adminCheckRelease responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReleaseStatus" description: OK summary: Check GitHub for a newer release now tags: - Instance Release /admin/settings: get: operationId: adminGetInstanceSettings responses: "200": content: application/json: schema: $ref: "#/components/schemas/InstanceSettings" description: OK summary: Get instance settings tags: - Instance Settings /admin/settings/public-activity: get: operationId: getPublicActivityPolicy responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityPolicy" description: OK summary: Get the instance public activity policy tags: - public-activity-settings put: operationId: updatePublicActivityPolicy requestBody: content: application/json: schema: $ref: "#/components/schemas/PublicActivityPolicy" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityPolicy" description: OK summary: Allow or stop public activity pages tags: - public-activity-settings /admin/settings/silent-mode: patch: operationId: adminUpdateSilentMode parameters: - description: Current settings ETag; required when releasing Silent Mode in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateSilentModeRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/InstanceSettings" description: Silent Mode updated "412": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: The supplied ETag is stale "428": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: If-Match is required when releasing Silent Mode summary: Engage or release the instance-wide silent mode tags: - Instance Settings /admin/users: get: operationId: adminListUsers parameters: - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 50 responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/AdminAccountView" description: OK summary: List accounts (paged) tags: - Admin /admin/users/{id}: patch: operationId: adminUpdateUser parameters: - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateAccountRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/AdminAccountView" description: OK summary: Update an account's app role tags: - Admin /admin/users/{id}/sessions: delete: operationId: adminRevokeUserSessions parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/RevokeSessionsResult" description: OK summary: "Force sign-out: revoke all of an account's active sessions" tags: - Admin /admin/workspaces: get: operationId: adminListWorkspaces responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/AdminWorkspaceView" description: OK summary: List all workspaces (metadata only) tags: - Admin /admin/workspaces/{workspaceSlug}/llm/budget: put: operationId: adminUpdateWorkspaceLlmBudget parameters: - in: path name: workspaceSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmBudgetRequest" required: true responses: "204": description: Cap updated summary: Set or clear a workspace's monthly cap on host-funded LLM spend tags: - Admin /auth/client/configuration: get: description: Public. A client that finds no such endpoint is talking to a server without installed-client sign-in. operationId: getClientSignInConfiguration parameters: - in: query name: clientId required: true schema: type: string pattern: "^[a-p]{32}$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ClientSignInConfiguration" description: Whether the client is registered "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The client id is not a Chrome extension id summary: Whether this instance lets the given installed client sign in tags: - Client session /auth/client/logout: post: operationId: logoutClientSession requestBody: content: application/json: schema: $ref: "#/components/schemas/ClientRefreshRequest" required: true responses: "204": description: "Signed out, or the secret was already unknown" "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "The body is malformed, or a request with a valid CSRF token\ \ also carries the browser session cookie" "403": content: application/json: {} description: The request carries the browser session cookie without a valid CSRF token. The server refuses it before the endpoint runs. "429": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "This address sent too many installed-client requests. Wait\ \ the number of seconds in the Retry-After header, then try again." summary: End the session its refresh secret belongs to tags: - Client session /auth/client/refresh: post: operationId: refreshClientSession requestBody: content: application/json: schema: $ref: "#/components/schemas/ClientRefreshRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ClientSessionTokens" description: Rotated "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "The body is malformed, or a request with a valid CSRF token\ \ also carries the browser session cookie" "401": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The session has ended. Sign in again. "403": content: application/json: {} description: The request carries the browser session cookie without a valid CSRF token. The server refuses it before the endpoint runs. "429": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "This address sent too many installed-client requests. Wait\ \ the number of seconds in the Retry-After header, then try again." summary: Rotate the session's access token and refresh secret tags: - Client session /auth/client/token: post: operationId: exchangeClientSignIn requestBody: content: application/json: schema: $ref: "#/components/schemas/ClientTokenRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ClientSessionTokens" description: Signed in "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "The body is malformed, the code is unknown, expired, used,\ \ or does not match the verifier, client or callback, or a request with\ \ a valid CSRF token also carries the browser session cookie" "403": content: application/json: {} description: The request carries the browser session cookie without a valid CSRF token. The server refuses it before the endpoint runs. "429": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "This address sent too many installed-client requests. Wait\ \ the number of seconds in the Retry-After header, then try again." summary: Redeem a sign-in handoff code with its PKCE verifier tags: - Client session /auth/csrf: get: description: "Fetch with credentials before any other credentialed request at\ \ startup and after sign-in or sign-out. Wait for this response before starting\ \ other requests. Send the token in the returned header on unsafe requests.\ \ With workspace subdomains enabled, a CSRF 403 has problem type urn:hephaestus:csrf.\ \ On that response, refetch once and retry the rejected request once." operationId: getCsrfToken responses: "200": content: application/json: schema: $ref: "#/components/schemas/CsrfToken" description: OK summary: Get the raw CSRF token for the current browser tags: - Auth /auth/logout: post: description: An installed-client access token ends its whole session. operationId: logout responses: "200": description: OK summary: Log out — revoke the current token + clear the cookie tags: - Auth /auth/refresh: post: operationId: refresh responses: "204": description: Session renewal completed "400": description: The token belongs to an installed-client session "401": description: Session has ended summary: "Rotate the access token (new jti, old revoked)" tags: - Auth /contributors: get: description: Returns contributors to the Hephaestus project (for the About page) operationId: listGlobalContributors responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/Contributor" description: list of contributors sorted by contribution count security: [] summary: List global contributors tags: - Contributors /identity-providers: get: operationId: listIdentityProviders responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/IdentityProviderView" description: OK summary: List available identity providers tags: - Auth discovery /internal/llm/admit-results: post: description: "Requires the private worker connector and a proxy-scoped worker\ \ credential bound to the workspace, job and attempt. Browser cookies and\ \ app-admin authority do not authorize this request." operationId: admitResults requestBody: content: application/json: schema: $ref: "#/components/schemas/AdmissionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/AdmissionResponse" description: OK security: - workerBearer: [] summary: Admit results for the current review attempt tags: - result-admission /internal/llm/prepare-feedback: post: description: Requires the same fenced worker credential and admitted ITEM review. Preparation persists the package before a provider write. operationId: prepareFeedback requestBody: content: application/json: schema: $ref: "#/components/schemas/PrepareFeedbackRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PrepareFeedbackResponse" description: OK security: - workerBearer: [] summary: Prepare feedback for an admitted item review tags: - result-admission /internal/llm/public-feedback-history: post: description: "Requires the same fenced worker credential and admitted ITEM review.\ \ Returns confirmed same-item, same-developer copy history; a refused read\ \ is not an empty history." operationId: readPublicFeedbackHistory responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicFeedbackHistory" description: OK security: - workerBearer: [] summary: Read authorized feedback receipts for the current item review tags: - result-admission /notifications/unsubscribe/{token}: post: operationId: unsubscribeEmail parameters: - in: path name: token required: true schema: type: string requestBody: content: application/x-www-form-urlencoded: schema: type: object properties: List-Unsubscribe: type: string required: - List-Unsubscribe multipart/form-data: schema: type: object properties: List-Unsubscribe: type: string required: - List-Unsubscribe responses: "204": description: "Subscription disabled, or token no longer applicable" security: [] summary: Unsubscribe from one optional email subscription tags: - Notification preferences /oauth/callback/{kind}: get: operationId: callbackGet parameters: - in: path name: kind required: true schema: type: string - in: query name: state required: false schema: type: string - in: query name: error required: false schema: type: string - in: query name: error_description required: false schema: type: string - in: query name: allParams required: true schema: type: object additionalProperties: type: string responses: "200": content: application/json: schema: type: object description: OK tags: - o-auth-callback post: operationId: callbackPost parameters: - in: path name: kind required: true schema: type: string - in: query name: state required: false schema: type: string - in: query name: error required: false schema: type: string - in: query name: error_description required: false schema: type: string - in: query name: allParams required: true schema: type: object additionalProperties: type: string responses: "200": content: application/json: schema: type: object description: OK tags: - o-auth-callback /product-feedback: post: operationId: submitInstanceProductFeedback requestBody: content: application/json: schema: $ref: "#/components/schemas/FeedbackRequest" required: true responses: "200": description: OK summary: Send instance-scoped product feedback tags: - instance-feedback /public/workspaces/{slug}/activity: get: operationId: getPublicActivity parameters: - in: path name: slug required: true schema: type: string - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivity" description: Public contributions counted security: [] summary: Read human contributions to public repositories tags: - public-activity /public/workspaces/{slug}/activity/people/{login}: get: operationId: getPublicActivityPerson parameters: - in: path name: slug required: true schema: type: string - in: path name: login required: true schema: type: string - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityPersonDetail" description: Public contributions counted security: [] summary: Read a person's published repository contributions tags: - public-activity /public/workspaces/{slug}/activity/people/{login}/work: get: operationId: getPublicActivityPersonWork parameters: - in: path name: slug required: true schema: type: string - in: path name: login required: true schema: type: string - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true - description: Kinds of activity to list (repeatable); omit for every kind in: query name: kinds required: false schema: type: array items: type: string enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED uniqueItems: true - description: The previous page's nextCursor; omit for the first page in: query name: cursor required: false schema: type: string - description: Page size from 1 to 100; defaults to 30 in: query name: size required: false schema: type: integer format: int32 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityWorkPage" description: Public work listed security: [] summary: Read a person's published work timeline tags: - public-activity /user: delete: operationId: deleteCurrentUser parameters: - in: header name: X-Confirm-Delete required: false schema: type: string responses: "200": description: OK summary: Delete the current account (GDPR Art. 17) tags: - Account get: operationId: getCurrentUser responses: "200": content: application/json: schema: $ref: "#/components/schemas/CurrentUserView" description: OK summary: Get the current user tags: - Account /user/ai-choice: get: operationId: getAccountAiChoice responses: "200": content: application/json: schema: $ref: "#/components/schemas/AccountAiChoice" description: OK summary: Get your AI choice tags: - Account put: operationId: updateAccountAiChoice requestBody: content: application/json: schema: $ref: "#/components/schemas/AccountAiChoiceRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/AccountAiChoice" description: OK summary: Change your AI choice for every workspace you are in tags: - Account /user/consent: get: operationId: getConsentStatus responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConsentStatus" description: OK summary: Get the current consent notice and status tags: - Consent put: operationId: completeFirstLoginConsent requestBody: content: application/json: schema: $ref: "#/components/schemas/FirstLoginConsent" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConsentStatus" description: OK summary: Complete the first-login transparency step tags: - Consent /user/consent/research: put: operationId: updateResearchConsent requestBody: content: application/json: schema: $ref: "#/components/schemas/ResearchConsent" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConsentStatus" description: OK summary: Grant or withdraw research consent tags: - Consent /user/exports: post: operationId: requestDataExport responses: "200": content: application/json: schema: $ref: "#/components/schemas/ExportCreated" description: OK summary: Request a data export (async) tags: - Account /user/exports/{id}: get: operationId: getDataExportStatus parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ExportStatus" description: OK summary: Get data-export status tags: - Account /user/exports/{id}/download: get: operationId: downloadDataExport parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: type: string format: byte description: OK summary: Download the data-export bundle tags: - Account /user/features: get: description: Returns all feature flags evaluated for the authenticated user. Combines role checks and server-side config toggles. operationId: getUserFeatures responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeatureFlags" description: Feature flags evaluated successfully summary: Get feature flags for the current user tags: - Account /user/identities: get: operationId: listLinkedIdentities responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/IdentityView" description: OK summary: List linked identity providers tags: - Account /user/identities/{id}: delete: operationId: unlinkIdentity parameters: - in: path name: id required: true schema: type: integer format: int64 responses: "204": description: Identity unlinked "404": description: No such identity on the current account "409": description: Cannot unlink the account's only remaining sign-in method summary: Unlink one of the current user's linked identity providers tags: - Account /user/notification-preferences: get: operationId: getNotificationPreferences responses: "200": content: application/json: schema: $ref: "#/components/schemas/NotificationPreferences" description: Your current email subscriptions headers: ETag: description: Strong validator for If-Match schema: type: string style: simple summary: Get your email subscriptions tags: - notification-preferences put: operationId: updateNotificationPreferences parameters: - description: Current preferences ETag in: header name: If-Match required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateNotificationPreferences" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/NotificationPreferences" description: Email subscriptions updated headers: ETag: description: Strong validator for the updated preferences schema: type: string style: simple "400": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Invalid preferences or If-Match header "403": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Enabling this subscription requires instance administration "409": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Enabling email requires a verified contact on an active account "412": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: The supplied ETag is stale "428": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: If-Match is required summary: Update your email subscriptions tags: - notification-preferences /user/public-activity: get: operationId: getPublicActivityChoice responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityChoice" description: OK summary: Get your account-wide public activity choice tags: - account-public-activity put: operationId: updatePublicActivityChoice requestBody: content: application/json: schema: $ref: "#/components/schemas/PublicActivityChoice" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityChoice" description: OK summary: Show or hide your activity on all public pages tags: - account-public-activity /user/public-activity/workspaces/{slug}/onboarding: get: operationId: getPublicActivityOnboarding parameters: - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityOnboarding" description: OK summary: Check your public-workspace onboarding tags: - public-activity-onboarding put: operationId: answerPublicActivityOnboarding parameters: - in: path name: slug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/PublicActivityOnboardingRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityOnboarding" description: OK summary: Show or hide yourself and finish this workspace's onboarding tags: - public-activity-onboarding /user/sessions: delete: operationId: revokeOtherSessions responses: "200": description: OK summary: Revoke all sessions except the current one tags: - Account get: operationId: listSessions responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SessionView" description: OK summary: List active sessions for the current user tags: - Account /user/sessions/{jti}: delete: description: "Any token of an installed-client session, even one it rotated\ \ away, ends that session." operationId: revokeSession parameters: - in: path name: jti required: true schema: type: string format: uuid responses: "200": description: OK summary: Revoke a single session tags: - Account /user/settings: get: operationId: getUserSettings responses: "200": content: application/json: schema: $ref: "#/components/schemas/UserSettings" description: OK summary: Get user settings tags: - Account post: operationId: updateUserSettings requestBody: content: application/json: schema: $ref: "#/components/schemas/UserSettings" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/UserSettings" description: OK summary: Update user settings tags: - Account /user/slack/preferences: get: operationId: getSlackUserPreferences responses: "200": content: application/json: schema: $ref: "#/components/schemas/SlackUserPreferences" description: OK summary: Get current user's Slack preferences tags: - Slack User Preferences /workspaces: get: operationId: listWorkspaces responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/WorkspaceListItem" description: Workspace list summary: List all workspaces tags: - workspace-registry post: operationId: createWorkspace requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateWorkspaceRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace created summary: Create a new workspace tags: - workspace-registry /workspaces/gitlab/groups: post: operationId: listGitLabGroups requestBody: content: application/json: schema: $ref: "#/components/schemas/GitLabPreflightRequest" required: true responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/GitLabGroup" description: Accessible groups summary: List GitLab groups accessible to a PAT tags: - git-lab-preflight /workspaces/gitlab/preflight: post: operationId: gitLabPreflight requestBody: content: application/json: schema: $ref: "#/components/schemas/GitLabPreflightRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/GitLabPreflightResponse" description: Validation result summary: Validate a GitLab PAT before workspace creation tags: - git-lab-preflight /workspaces/providers: get: description: Returns available workspace providers with their configuration. Public endpoint — no authentication required. operationId: getProviders responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceProviders" description: OK security: [] summary: List available workspace creation providers tags: - workspace-registry /workspaces/{workspaceSlug}: delete: operationId: purgeWorkspace parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "204": description: Workspace purged summary: Permanently delete a workspace and purge its data tags: - workspace get: operationId: getWorkspace parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace returned summary: Fetch a workspace by slug tags: - workspace /workspaces/{workspaceSlug}/activity/facets: get: description: "The same lists the people read carries, without counting anyone.\ \ No period, team or repository changes them." operationId: getActivityFacets parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityFacets" description: Repositories and teams listed "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: List the repositories and teams that activity can be narrowed to tags: - Activity /workspaces/{workspaceSlug}/activity/hidden-contributors: get: operationId: listHiddenContributors parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/UserInfo" description: Hidden contributors listed "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: List the contributors without a membership whom an admin hid from activity tags: - Activity /workspaces/{workspaceSlug}/activity/me: get: operationId: getOwnActivity parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityPersonDetail" description: Your activity returned "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: Read your activity in this workspace tags: - Activity /workspaces/{workspaceSlug}/activity/me/work: get: operationId: getOwnActivityWork parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true - description: Kinds of activity to list (repeatable); omit for every kind in: query name: kinds required: false schema: type: array items: type: string enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED uniqueItems: true - description: The previous page's nextCursor; omit for the first page in: query name: cursor required: false schema: type: string - description: Page size from 1 to 100; defaults to 30 in: query name: size required: false schema: type: integer format: int32 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityWorkPage" description: Your work listed "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: List the work on which your activity happened tags: - Activity /workspaces/{workspaceSlug}/activity/members/{login}/open-work: get: description: "Review requests, open pull requests and assigned issues, most\ \ recently updated first. Pull requests carry their reviewers." operationId: getOpenWork parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: The member's login in: path name: login required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/OpenWork" description: Open work listed "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: List what is open for a member tags: - Activity /workspaces/{workspaceSlug}/activity/people: get: operationId: getActivityPeople parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityPeople" description: Contributors counted "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: Count each contributor and automation account in one response tags: - Activity /workspaces/{workspaceSlug}/activity/people/{userId}: get: operationId: getActivityPerson parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: userId required: true schema: type: integer format: int64 - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityPersonDetail" description: Contributor activity counted "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: "Count a contributor by week, type and repository" tags: - Activity /workspaces/{workspaceSlug}/activity/people/{userId}/automation: patch: operationId: updateActivityAutomation parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: userId required: true schema: type: integer format: int64 - in: query name: treatAsAutomation required: true schema: type: boolean responses: "204": description: Automation classification updated "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: "Treat a contributor as automation, or reset the classification" tags: - Activity /workspaces/{workspaceSlug}/activity/people/{userId}/public-visibility: patch: operationId: updatePublicActivityObjection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: userId required: true schema: type: integer format: int64 - in: query name: hidden required: true schema: type: boolean responses: "204": description: Contributor visibility updated "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: "Honor a contributor publication objection, or restore workspace visibility" tags: - Activity /workspaces/{workspaceSlug}/activity/people/{userId}/work: get: operationId: getActivityPersonWork parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: userId required: true schema: type: integer format: int64 - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true - description: Kinds of activity to list (repeatable); omit for every kind in: query name: kinds required: false schema: type: array items: type: string enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED uniqueItems: true - description: The previous page's nextCursor; omit for the first page in: query name: cursor required: false schema: type: string - description: Page size from 1 to 100; defaults to 30 in: query name: size required: false schema: type: integer format: int32 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityWorkPage" description: One page of contributor work "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: List a contributor's work one page at a time tags: - Activity /workspaces/{workspaceSlug}/activity/public-hidden-count: get: operationId: getPublicActivityHiddenCount parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityHiddenCount" description: Hidden contributors counted "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: Count hidden public contributors without identifying them tags: - Activity /workspaces/{workspaceSlug}/activity/work: get: description: "One member's activity when login is given, otherwise everyone's\ \ in the workspace or the team. With both, the member's activity within the\ \ team's scope. Each pull request or issue is listed once, by its latest activity\ \ in the range, newest first." operationId: getActivityWork parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: login required: false schema: type: string - in: query name: team required: false schema: type: string - in: query name: repo required: false schema: type: array items: type: string uniqueItems: true - description: Activity range in: query name: range required: false schema: type: string enum: - 30d - 90d - 1y - all - custom - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - description: Kinds of activity to list (repeatable); omit for every kind in: query name: kinds required: false schema: type: array items: type: string enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED uniqueItems: true - description: The previous page's nextCursor; omit for the first page in: query name: cursor required: false schema: type: string - description: Page size from 1 to 100; defaults to 30 in: query name: size required: false schema: type: integer format: int32 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ActivityWorkPage" description: One page of work "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: A request parameter is not valid "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of the workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Workspace, contributor, team or repository not found" summary: "List activity by the pull request or issue it happened on, one page\ \ at a time" tags: - Activity /workspaces/{workspaceSlug}/agents: get: operationId: listAgents parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/AgentBinding" description: Bindings returned summary: List the workspace's agents and how each is configured tags: - Agents /workspaces/{workspaceSlug}/agents/{purpose}: delete: operationId: deleteAgent parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: purpose required: true schema: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING - in: query name: dataHandlingTier required: false schema: type: string default: UNDECLARED enum: - IN_HOUSE - CLOUD - UNDECLARED responses: "204": description: Binding removed summary: Remove the agent for one purpose (turn it off) tags: - Agents put: operationId: configureAgent parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: purpose required: true schema: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING - in: query name: dataHandlingTier required: false schema: type: string default: UNDECLARED enum: - IN_HOUSE - CLOUD - UNDECLARED requestBody: content: application/json: schema: $ref: "#/components/schemas/AgentBindingRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/AgentBinding" description: Binding saved "404": description: Model not found "409": description: "The model is undeclared, or declared as another tier than\ \ this slot (problem type agent-binding-slot-mismatch, property declaredTier)" summary: Configure the agent for one purpose tags: - Agents /workspaces/{workspaceSlug}/config-audit: get: operationId: listWorkspaceConfigAuditEvents parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 50 - in: query name: entityType required: false schema: type: array items: type: string enum: - PRACTICE_REVIEW_SETTINGS - AGENT_BINDING - AGENT_CONFIG - AI_CONFIG_BINDING - WORKSPACE_ROLE - ACTIVITY_AUTOMATION - WORKSPACE_FEATURES - WORKSPACE_STATUS - WORKSPACE_TOKEN - WORKSPACE_VISIBILITY - PRACTICE_ACTIVE - PRACTICE_USAGE - PRACTICE_DEFINITION - PRACTICE_GROUP - CATALOG_PRACTICE - CATALOG_GROUP - WORKSPACE_INSTANCE_LLM_BUDGET - WORKSPACE_OWN_PROVIDER_LLM_BUDGET - WORKSPACE_LLM_BUDGET - WORKSPACE_BYO_LLM_BUDGET - REVIEW_BATCH - REVIEW_SCHEDULE - FEEDBACK_DELIVERY_RECHECK - WORKSPACE_LLM_CONNECTION - WORKSPACE_LLM_MODEL - in: query name: entityId required: false schema: type: string - in: query name: changedKey required: false schema: type: string - in: query name: action required: false schema: type: array items: type: string enum: - CREATED - UPDATED - DELETED - in: query name: actorId required: false schema: type: integer format: int64 - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOConfigAuditEntryView" description: OK summary: "List this workspace's admin configuration changes (paged, newest first)" tags: - Config Audit /workspaces/{workspaceSlug}/connections: get: operationId: list parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ConnectionSummary" description: OK tags: - Connections post: operationId: initiate parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/InitiateConnectionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/InitiateConnectionResponse" description: OK tags: - Connections /workspaces/{workspaceSlug}/connections/catalog: get: operationId: getIntegrationCatalog parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/IntegrationCatalogEntry" description: OK summary: "Every integration kind this workspace could connect, joined against\ \ existing connections" tags: - Sync /workspaces/{workspaceSlug}/connections/outline/token: get: description: "Probes Outline directly. Reports whether the token is still accepted\ \ and, when the token may list its own key, its name, expiry and last use.\ \ Outline cannot rotate a key from a key, so an expiring token is renewed\ \ in Outline and re-entered here." operationId: getOutlineTokenStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/OutlineTokenStatus" description: Token state returned "404": description: The workspace has no ACTIVE Outline connection summary: Live state of the API token behind this workspace's Outline connection tags: - Connections /workspaces/{workspaceSlug}/connections/{connectionId}/sync: get: operationId: getConnectionSyncStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConnectionSyncStatus" description: OK summary: Unified sync status for one connection tags: - Sync /workspaces/{workspaceSlug}/connections/{connectionId}/sync/jobs: get: operationId: listConnectionSyncJobs parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 20 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOSyncJob" description: OK summary: Paginated sync job history for one connection tags: - Sync post: description: |- Trigger a manual sync. Idempotent-absorb: a connection that already has an active job answers 200 with that job rather than erroring, so a double-click "Sync now" is harmless. operationId: triggerSyncJob parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/TriggerSyncJobRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/SyncJob" description: "Idempotent-absorb: a same-type job was already running and\ \ is returned unchanged" "202": content: application/json: schema: $ref: "#/components/schemas/SyncJob" description: A new sync job was created and dispatched "400": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Missing or invalid request body (e.g. absent sync type) "404": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Connection not found in this workspace "409": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Connection is not ACTIVE, a different sync type is already\ \ running, or manual sync is unsupported for the kind" "503": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: The server is too busy to dispatch the sync; retry later summary: Trigger a manual sync or backfill tags: - Sync /workspaces/{workspaceSlug}/connections/{connectionId}/sync/jobs/{jobId}: patch: operationId: updateConnectionSyncJob parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 - in: path name: jobId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateSyncJobRequest" required: true responses: "202": content: application/json: schema: $ref: "#/components/schemas/SyncJob" description: Cancellation requested; the running job stops cooperatively "400": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: The update does not request cancellation "404": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Job not found in this workspace, or not owned by this connection" "409": content: application/json: schema: $ref: "#/components/schemas/ProblemDetail" description: Job is already in a terminal status summary: Update a running sync job tags: - Sync /workspaces/{workspaceSlug}/connections/{connectionId}/sync/resources: get: operationId: listConnectionSyncResources parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SyncResourceState" description: OK summary: Per-resource sync state (repos / channels / collections) for one connection tags: - Sync /workspaces/{workspaceSlug}/connections/{id}: get: operationId: read parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConnectionDetail" description: OK tags: - Connections /workspaces/{workspaceSlug}/connections/{id}/audit: get: operationId: audit parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ConnectionAuditEntry" description: OK tags: - Connections /workspaces/{workspaceSlug}/connections/{id}/status: patch: description: |- Resource-oriented lifecycle transition: ACTIVE (reactivate), SUSPENDED (suspend), or UNINSTALLED (disconnect). Disconnecting erases the integration's mirrored data and then, best effort, removes what it installed at the provider; if the erase fails, the connection is left unchanged. PENDING is internal to the OAuth handshake and rejected as a bad request; illegal transitions surface as 409 via the state machine. operationId: updateConnectionStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateConnectionStatusRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ConnectionSummary" description: OK summary: |- Resource-oriented lifecycle transition: ACTIVE (reactivate), SUSPENDED (suspend), or UNINSTALLED (disconnect). tags: - Connections /workspaces/{workspaceSlug}/features: patch: operationId: updateFeatures parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspaceFeaturesRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace updated summary: Update workspace feature flags tags: - workspace /workspaces/{workspaceSlug}/llm/available-models: get: operationId: workspaceListAvailableLlmModels parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/AvailableLlmModel" description: OK summary: List models this workspace can bind a Task to (shared + your own) tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/budget: put: operationId: updateWorkspaceLlmBudget parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateLlmBudgetRequest" required: true responses: "204": description: Cap updated summary: Set or clear this workspace's monthly cap on its own-provider LLM spend tags: - LLM Usage /workspaces/{workspaceSlug}/llm/connections: get: operationId: workspaceListLlmConnections parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/WorkspaceLlmConnection" description: OK summary: List your AI provider connections tags: - Workspace LLM post: operationId: workspaceCreateLlmConnection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateWorkspaceLlmConnectionRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmConnection" description: Connection created; URL in the Location header "409": description: A connection with this slug already exists in this workspace summary: Connect your own AI provider tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/connections/{connectionId}/models: post: operationId: workspaceCreateLlmModel parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: connectionId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateWorkspaceLlmModelRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmModel" description: Model created; URL in the Location header "404": description: AI provider connection not found "409": description: A model with this slug or upstream model id already exists on the connection summary: Create a model on your AI provider tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/connections/{id}: delete: operationId: workspaceDeleteLlmConnection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "204": description: Connection removed "404": description: Connection not found "409": description: Cannot delete a connection still referenced by one or more models summary: Remove your AI provider connection tags: - Workspace LLM get: operationId: workspaceGetLlmConnection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmConnection" description: OK "404": description: Connection not found summary: Get one of your AI provider connections tags: - Workspace LLM patch: operationId: workspaceUpdateLlmConnection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspaceLlmConnectionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmConnection" description: OK "404": description: Connection not found summary: Update your AI provider connection tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/connections/{id}/probe: post: operationId: workspaceProbeLlmConnection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmProbeResult" description: OK summary: Test your AI provider connection tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/models: get: operationId: workspaceListLlmModels parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/WorkspaceLlmModel" description: OK summary: List models on your AI provider tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/models/{id}: delete: operationId: workspaceDeleteLlmModel parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "204": description: Model removed "404": description: Model not found "409": description: Cannot delete a model still bound to an agent configuration summary: Remove a model on your AI provider tags: - Workspace LLM get: operationId: workspaceGetLlmModel parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmModel" description: OK "404": description: Model not found summary: Get a model on your AI provider tags: - Workspace LLM patch: operationId: workspaceUpdateLlmModel parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspaceLlmModelRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmModel" description: OK "404": description: Model not found "409": description: Another model on the connection already uses this upstream model id summary: Update a model on your AI provider tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/settings: get: operationId: workspaceGetLlmSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmSettings" description: OK summary: Get the instance LLM policy as it applies to this workspace tags: - Workspace LLM /workspaces/{workspaceSlug}/llm/usage: get: operationId: getLlmUsageReport parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: month required: false schema: type: string pattern: "\\d{4}-(0[1-9]|1[0-2])" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceLlmUsageReport" description: OK summary: Get the workspace's LLM usage report for one month tags: - LLM Usage /workspaces/{workspaceSlug}/members: get: operationId: listMemberships parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: q required: false schema: type: string - in: query name: team required: false schema: type: string exclusiveMinimum: 0 - description: Zero-based page index (0..N) in: query name: page required: false schema: type: integer default: 0 minimum: 0 - description: The size of the page to be returned in: query name: size required: false schema: type: integer default: 50 minimum: 1 - description: "Sorting criteria in the format: property,(asc|desc). Default\ \ sort order is ascending. Multiple sort criteria are supported." in: query name: sort required: false schema: type: array default: - "joinedAt,ASC" items: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOWorkspaceMembership" description: OK summary: List workspace memberships tags: - membership /workspaces/{workspaceSlug}/members/assign: post: operationId: assignMemberRole parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/AssignRoleRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceMembership" description: OK summary: Assign a workspace role tags: - membership /workspaces/{workspaceSlug}/members/me: get: operationId: getOwnMembership parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceMembership" description: OK summary: Get your workspace membership tags: - membership /workspaces/{workspaceSlug}/members/{accountId}: delete: operationId: removeMember parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: accountId required: true schema: type: string maximum: 9223372036854776000 pattern: "^[1-9][0-9]*$" responses: "204": description: Membership removed summary: Remove a workspace member tags: - membership get: operationId: getMembership parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: accountId required: true schema: type: string maximum: 9223372036854776000 pattern: "^[1-9][0-9]*$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceMembership" description: OK summary: Get a workspace membership tags: - membership /workspaces/{workspaceSlug}/members/{accountId}/hidden: patch: operationId: setMemberHidden parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: accountId required: true schema: type: string maximum: 9223372036854776000 pattern: "^[1-9][0-9]*$" requestBody: content: application/json: schema: $ref: "#/components/schemas/SetMemberHiddenRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceMembership" description: OK summary: Change a member’s activity visibility tags: - membership /workspaces/{workspaceSlug}/mentor/sandbox: post: operationId: prepareMentorSandbox parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "202": description: Accepted; the sandbox starts unless it is already warm or Heph could not answer anyway summary: Prepare the current member's Heph sandbox in the background tags: - Mentor Chat /workspaces/{workspaceSlug}/mentor/threads: get: operationId: listThreads parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ChatThreadSummary" description: "Threads returned, newest first" summary: List the current user's mentor threads in this workspace tags: - Mentor Threads /workspaces/{workspaceSlug}/mentor/threads/{threadId}: delete: operationId: deleteThread parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: threadId required: true schema: type: string format: uuid responses: "204": description: Thread deleted "404": description: Thread not found OR not owned by current user summary: "Delete a mentor thread (cascades to messages, votes, parts)" tags: - Mentor Threads get: operationId: getThread parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: threadId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ChatThreadDetail" description: "Thread, messages and the owner's votes returned" "404": description: Thread not found OR not owned by current user summary: Get a mentor thread with its full message history tags: - Mentor Threads /workspaces/{workspaceSlug}/mentor/threads/{threadId}/messages/{messageId}/vote: delete: operationId: removeVote parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: threadId required: true schema: type: string format: uuid - in: path name: messageId required: true schema: type: string format: uuid responses: "204": description: Vote removed or did not exist "404": description: Thread or message not found (or not owned by current user) summary: Remove a vote on an assistant message (idempotent) tags: - Mentor Votes post: operationId: vote parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: threadId required: true schema: type: string format: uuid - in: path name: messageId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/ChatMessageVoteRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ChatMessageVote" description: Vote recorded "404": description: Thread or message not found (or not owned by current user) summary: Upsert a vote on an assistant message tags: - Mentor Votes /workspaces/{workspaceSlug}/onboarding/me: get: operationId: getMemberOnboarding parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboarding" description: OK summary: Get your first-visit setup and AI choice in this workspace tags: - workspace-onboarding /workspaces/{workspaceSlug}/onboarding/me/ai-choice: put: operationId: updateAiChoice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/AiChoiceRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboarding" description: OK summary: Change your AI choice without changing workspace membership tags: - workspace-onboarding /workspaces/{workspaceSlug}/onboarding/me/dismissal: put: operationId: dismissMemberOnboarding parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboarding" description: OK summary: Skip first-visit setup for now without treating that as an AI choice tags: - workspace-onboarding /workspaces/{workspaceSlug}/onboarding/settings: get: operationId: getMemberOnboardingSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboardingSettings" description: OK summary: Get this workspace's member-onboarding settings tags: - workspace-onboarding put: operationId: updateMemberOnboardingSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboardingSettings" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceOnboardingSettings" description: OK summary: Configure first-visit setup and required workspace account links tags: - workspace-onboarding /workspaces/{workspaceSlug}/onboarding/settings/links: get: operationId: getMemberOnboardingLinkOptions parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/WorkspaceOnboardingLink" description: OK summary: List workspace account links available for onboarding requirements tags: - workspace-onboarding /workspaces/{workspaceSlug}/outline/collections: get: operationId: listOutlineCollections parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/OutlineCollection" description: Mirrored collections returned "404": description: The workspace has no ACTIVE Outline connection summary: List the workspace's mirrored Outline collections with their sync state tags: - Outline collections post: operationId: registerOutlineCollection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/RegisterOutlineCollectionRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/OutlineCollection" description: Collection was already registered (idempotent repeat) "201": content: application/json: schema: $ref: "#/components/schemas/OutlineCollection" description: Collection registered; the Location header points at the collection resource "404": description: The workspace has no ACTIVE Outline connection "409": description: A concurrent registration of the same collection won the race "422": description: Outline does not know the requested collection id summary: Register an Outline collection for mirroring (lands ENABLED + PENDING; idempotent on the id) tags: - Outline collections /workspaces/{workspaceSlug}/outline/collections/candidates: get: description: "Proxies Outline's collections.list with the stored token under\ \ a bounded interactive page budget. Served with Cache-Control: no-store —\ \ the live upstream view must not be cached." operationId: listOutlineCollectionCandidates parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/OutlineCollectionCandidate" description: "Candidate collections returned (Cache-Control: no-store)" "404": description: The workspace has no ACTIVE Outline connection "502": description: The Outline server could not be reached or answered with an error "503": description: Outline limited the request rate. The Retry-After header carries the seconds to wait before retrying. summary: List the Outline collections available to mirror (live proxy; doubles as connectivity probe) tags: - Outline collections /workspaces/{workspaceSlug}/outline/collections/{collectionId}: delete: operationId: deleteOutlineCollection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: collectionId required: true schema: type: string responses: "204": description: Collection removed and its mirrored documents erased "404": description: "The collection is not registered for this workspace, or the\ \ workspace has no ACTIVE Outline connection" summary: Remove a collection from the mirror and erase its mirrored documents (terminal) tags: - Outline collections get: operationId: getOutlineCollection parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: collectionId required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/OutlineCollection" description: Mirrored collection returned "404": description: "The collection is not registered for this workspace, or the\ \ workspace has no ACTIVE Outline connection" summary: One mirrored Outline collection with its sync state and live document count tags: - Outline collections patch: description: Resuming (PAUSED → ENABLED) resets the sync status to PENDING and kicks a targeted sync; requesting the current state is an idempotent no-op. operationId: updateOutlineCollectionState parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: collectionId required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateOutlineCollectionStateRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/OutlineCollection" description: Collection state after the transition returned "404": description: "The collection is not registered for this workspace, or the\ \ workspace has no ACTIVE Outline connection" summary: Transition a mirrored collection to a target mirror state (pause / resume) tags: - Outline collections /workspaces/{workspaceSlug}/practice-catalog/adoption: get: operationId: listAdoptablePractices parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/CatalogPracticeSummary" description: Available practices returned "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Workspace administrator access is required summary: List practices available for adoption tags: - Practice Catalog Adoption /workspaces/{workspaceSlug}/practice-catalog/adoption/groups/{slug}: get: operationId: previewGroupAdoption parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroupAdoptionPreview" description: OK summary: Preview adoption of a catalog group and its practices tags: - Practice Catalog Adoption post: operationId: adoptGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogGroupAdoptionResult" description: OK summary: Adopt all available practices in a catalog group tags: - Practice Catalog Adoption /workspaces/{workspaceSlug}/practice-catalog/adoption/{slug}: get: operationId: previewPracticeAdoption parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/CatalogPracticePreview" description: Adoption preview returned headers: ETag: description: Strong validator for If-Match style: simple "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Workspace administrator access is required "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Practice is not offered summary: Get a practice adoption preview tags: - Practice Catalog Adoption post: operationId: adoptPractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "201": content: application/json: schema: $ref: "#/components/schemas/Practice" description: Practice adopted "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Workspace administrator access is required "409": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The practice slug already exists in the workspace "412": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Catalog or workspace state changed since preview "428": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The If-Match preview validator is required summary: Adopt a catalog practice tags: - Practice Catalog Adoption /workspaces/{workspaceSlug}/practice-groups: get: operationId: listPracticeGroups parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: shownToDevelopersOnly required: false schema: type: boolean responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group post: operationId: createPracticeGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreatePracticeGroupRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/PracticeGroup" description: Practice group created tags: - practice-group /workspaces/{workspaceSlug}/practice-groups/reorder: patch: operationId: reorderPracticeGroups parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/ReorderRequest" required: true responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group /workspaces/{workspaceSlug}/practice-groups/standings: get: description: "Returns every active practice group's standing, direction, guidance,\ \ and supporting results." operationId: getOwnGroupStandings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeGroupStanding" description: Practice group standings returned summary: List the current developer's practice group standings tags: - Practice Group Standings /workspaces/{workspaceSlug}/practice-groups/{groupSlug}: delete: operationId: deletePracticeGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string responses: "204": description: Practice group deleted tags: - practice-group get: operationId: getPracticeGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group patch: operationId: updatePracticeGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdatePracticeGroupRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group /workspaces/{workspaceSlug}/practice-groups/{groupSlug}/catalog-customization: delete: operationId: resetGroupToCatalog parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group /workspaces/{workspaceSlug}/practice-groups/{groupSlug}/feedback-mode: patch: operationId: setGroupFeedbackMode parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/SetFeedbackModeRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeGroup" description: OK tags: - practice-group /workspaces/{workspaceSlug}/practice-groups/{groupSlug}/reviews: get: operationId: listOwnGroupReviews parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: groupSlug required: true schema: type: string - in: query name: itemKind required: false schema: type: string - in: query name: since required: false schema: type: string format: date-time - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 20 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOProfileReview" description: OK summary: List your reviews in a practice group tags: - practice-group-detail /workspaces/{workspaceSlug}/practice-profile/overview: get: description: "Returns the practices met as a strength, every change to a standing,\ \ trend, group or piece of feedback inside the window, and the work reviewed\ \ inside it, as structured events. The window opens at the run before the\ \ latest one and closes now; with no such run it spans the standing's look-back\ \ of 90 days." operationId: getOwnPracticeProfileOverview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeProfileOverview" description: Practice profile overview returned summary: "What was met, what changed and which work was reviewed since the run\ \ before the latest one" tags: - Practice Profile /workspaces/{workspaceSlug}/practice-profile/reviews: get: operationId: listOwnReviews parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: itemKind required: false schema: type: string - in: query name: since required: false schema: type: string format: date-time - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 20 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOProfileReview" description: OK summary: List reviews with results about you tags: - practice-profile-review /workspaces/{workspaceSlug}/practice-profile/reviews/{reviewId}: get: operationId: getOwnReview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ProfileReviewDetail" description: OK summary: Get your results from a review tags: - practice-profile-review /workspaces/{workspaceSlug}/practices: get: operationId: listPractices parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: feedbackMode required: false schema: type: string enum: - "OFF" - APPROVE_FIRST - AUTOMATIC responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog post: operationId: createPractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreatePracticeRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/Practice" description: Practice created tags: - practice-catalog /workspaces/{workspaceSlug}/practices/definition-options: get: operationId: getPracticeDefinitionOptions parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeDefinitionOptions" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/feedback-modes: get: operationId: getFeedbackModeRollup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackModeRollup" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/feedback/on-work: get: description: "Read-only metadata for up to 50 in-context pieces of feedback\ \ addressed to the caller with recorded provider comments, newest delivery\ \ first. Uses the exact connected-provider work lookup. Only recorded successful\ \ deliveries are included, even when the remaining delivery failed. Incomplete\ \ reviews omit draft practice metadata. No bodies, private conversations or\ \ replaced feedback; admin status does not broaden the recipient. Permalinks\ \ are recorded provider links, not live existence checks." operationId: getOwnDeliveredWorkFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: url required: true schema: type: string maxLength: 2048 minLength: 0 responses: "200": content: application/json: schema: $ref: "#/components/schemas/DeliveredWorkFeedback" description: OK summary: The caller's recorded feedback comments on this work tags: - Practice feedback /workspaces/{workspaceSlug}/practices/feedback/practice-page: get: operationId: getOwnPracticePageFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticePageFeedback" description: OK summary: Read your practice feedback tags: - practice-page-feedback /workspaces/{workspaceSlug}/practices/feedback/resolution-counts: get: operationId: getOwnFeedbackResolutionCounts parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackResolutionCounts" description: OK summary: Get feedback resolution counts tags: - Feedback Response /workspaces/{workspaceSlug}/practices/feedback/{feedbackId}/response: delete: operationId: clearOwnFeedbackResponse parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackResponse" description: Complete cleared response returned "404": description: Delivered feedback not found for the current recipient summary: Clear the response to delivered feedback tags: - Feedback Response get: operationId: getOwnFeedbackResponse parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackResponse" description: Complete current response returned "404": description: Delivered feedback not found for the current recipient summary: Get the current feedback response tags: - Feedback Response put: description: Sets the complete current response. Repeating the same request has no effect. operationId: replaceOwnFeedbackResponse parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/FeedbackResponseRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/FeedbackResponse" description: Response replaced "400": description: Invalid response "404": description: Delivered feedback not found for the current recipient "409": description: A workspace admin withdrew this feedback summary: Replace the response to delivered feedback tags: - Feedback Response /workspaces/{workspaceSlug}/practices/items: get: operationId: listReviewItems parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: itemKind required: false schema: type: string - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOItemRef" description: OK summary: List items in the workspace tags: - item /workspaces/{workspaceSlug}/practices/items/legacy-feedback/{artifactKind}/{artifactId}: get: operationId: resolveLegacyFeedbackItem parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: artifactKind required: true schema: type: string - in: path name: artifactId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/LegacyFeedbackItem" description: OK summary: Resolve a feedback link posted before item IDs tags: - item /workspaces/{workspaceSlug}/practices/items/{itemId}: get: operationId: getReviewItem parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ItemRef" description: OK summary: Get an item tags: - item /workspaces/{workspaceSlug}/practices/items/{itemId}/events: get: operationId: listItemEvents parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOItemEvent" description: OK summary: List item events tags: - item /workspaces/{workspaceSlug}/practices/items/{itemId}/facts: get: operationId: getItemFacts parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ItemFacts" description: OK summary: Get current facts about an item tags: - item /workspaces/{workspaceSlug}/practices/items/{itemId}/own-trace: get: operationId: getOwnItemTrace parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/OwnItemTrace" description: OK summary: Trace your results from an item review tags: - item-trace /workspaces/{workspaceSlug}/practices/items/{itemId}/reviews: get: operationId: listOwnItemReviews parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 20 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOProfileReview" description: OK summary: List your reviews of an item tags: - item /workspaces/{workspaceSlug}/practices/items/{itemId}/trace: get: operationId: getItemTrace parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: itemId required: true schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ItemTrace" description: OK summary: Trace reviews of an item tags: - item-trace /workspaces/{workspaceSlug}/practices/practice-script-needs: get: operationId: listPracticeScriptNeeds parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeScriptSummary" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/releases: get: operationId: listPracticeReleases parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeReleaseProposal" description: OK summary: List pending practice releases tags: - Practice Catalog /workspaces/{workspaceSlug}/practices/releases/{slug}: delete: operationId: declinePracticeRelease parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string - in: header name: If-Match required: true schema: type: string responses: "204": description: The offered version was declined summary: Decline this version of a practice release tags: - Practice Catalog get: operationId: getPracticeRelease parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeReleaseProposal" description: OK summary: "Compare the adopted, current, and offered practice" tags: - Practice Catalog put: operationId: acceptPracticeRelease parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slug required: true schema: type: string - in: header name: If-Match required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/AcceptPracticeReleaseRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK summary: Accept selected fields from a practice release tags: - Practice Catalog /workspaces/{workspaceSlug}/practices/reorder: patch: operationId: reorderPractices parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/ReorderRequest" required: true responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/results: get: description: Paginated results for the authenticated developer with optional filters operationId: listOwnResults parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: outcome required: false schema: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE - in: query name: itemKind required: false schema: type: string - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: severity required: false schema: type: array items: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - in: query name: displayableOnly required: false schema: type: boolean - in: query name: sort required: false schema: type: string enum: - NEWEST - ACTIONABILITY - in: query name: page required: false schema: type: integer format: int32 - in: query name: size required: false schema: type: integer format: int32 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOResultList" description: Paginated results returned summary: List results for current developer tags: - Practice Results /workspaces/{workspaceSlug}/practices/results/{resultId}: get: operationId: getOwnResult parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: resultId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ResultDetail" description: Result detail returned "404": description: Result not found or not owned by current user summary: Get result detail tags: - Practice Results /workspaces/{workspaceSlug}/practices/review-batches: get: operationId: listReviewBatches parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: page required: false schema: type: integer format: int32 default: 0 - in: query name: size required: false schema: type: integer format: int32 default: 20 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOReviewBatch" description: OK summary: List review batches tags: - review-batch post: operationId: createReviewBatch parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateReviewBatchRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/ReviewBatch" description: Created summary: Create a review batch tags: - review-batch /workspaces/{workspaceSlug}/practices/review-batches/{batchId}: get: operationId: getReviewBatch parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: batchId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewBatch" description: OK summary: Get a review batch tags: - review-batch /workspaces/{workspaceSlug}/practices/review-batches/{batchId}/status: patch: operationId: updateReviewBatchStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: batchId required: true schema: type: string format: uuid - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateReviewBatchStatusRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewBatch" description: OK summary: "Pause, resume or cancel a review batch" tags: - review-batch /workspaces/{workspaceSlug}/practices/review-context: get: description: "Reads the address only: nothing is fetched from it. The address\ \ must be on the server this workspace is connected to. Every way of not finding\ \ the work — not mirrored, not monitored here, another server, deleted or\ \ confidential — is the same 404." operationId: resolveReviewContext parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: "The provider page's address, as the browser shows it" in: query name: url required: true schema: type: string maxLength: 2048 minLength: 0 responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewContext" description: "The work, and what the caller may do about it" "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: "Not an HTTPS address, or not the page of a pull request, merge\ \ request or issue" "403": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: The caller is not a member of this workspace "404": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: This workspace has no reviewed work at this address summary: Find the reviewed work a provider page shows tags: - Practice review requests /workspaces/{workspaceSlug}/practices/review-requests: post: operationId: requestReview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateReviewRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewRequestOutcome" description: OK summary: Ask for a review of an item tags: - review-request /workspaces/{workspaceSlug}/practices/review-schedules: get: operationId: listReviewSchedules parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ReviewSchedule" description: OK summary: List review schedules tags: - review-schedule post: operationId: createReviewSchedule parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/ReviewScheduleInput" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/ReviewSchedule" description: Created summary: Create a review schedule tags: - review-schedule /workspaces/{workspaceSlug}/practices/review-schedules/{scheduleId}: delete: operationId: deleteReviewSchedule parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scheduleId required: true schema: type: string format: uuid - in: header name: If-Match required: false schema: type: string responses: "204": description: Deleted summary: Delete an unused review schedule tags: - review-schedule patch: operationId: setReviewScheduleEnabled parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scheduleId required: true schema: type: string format: uuid - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/SetReviewScheduleEnabledRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewSchedule" description: OK summary: Enable or disable a review schedule tags: - review-schedule put: operationId: updateReviewSchedule parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scheduleId required: true schema: type: string format: uuid - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/ReviewScheduleInput" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewSchedule" description: OK summary: Update a review schedule tags: - review-schedule /workspaces/{workspaceSlug}/practices/review-settings: get: operationId: getPracticeReviewSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeReviewSettings" description: Policy returned summary: Get the workspace's practice-review policy tags: - Practice Review Settings patch: operationId: updatePracticeReviewSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: header name: If-Match required: false schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdatePracticeReviewSettingsRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeReviewSettings" description: Policy updated summary: Update the workspace's practice-review policy tags: - Practice Review Settings /workspaces/{workspaceSlug}/practices/review-settings/scope-preview: post: operationId: previewReviewScope parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/WorkspaceReviewScope" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeReviewScopePreview" description: OK tags: - Practice Review Settings /workspaces/{workspaceSlug}/practices/reviewed: get: operationId: listReviewedPractices parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ReviewedPractice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/reviews: get: description: Results are ordered newest first. operationId: listReviews parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 - in: query name: status required: false schema: type: array items: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED - in: query name: kind required: false schema: type: string enum: - ITEM - SCAN - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: developerId required: false schema: type: integer format: int64 - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOReviewSummary" description: Paginated review summaries returned "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Invalid filter or pagination summary: List practice reviews with result and feedback outcomes tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/evidence-outcomes: get: description: "One entry per practice that recent reviews considered, with the\ \ sources that skipped it." operationId: getReviewEvidenceOutcomes parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ReviewEvidenceOutcome" description: Evidence outcomes returned summary: Summarize how each practice's evidence requirements turned out on recent reviews tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/feedback: get: operationId: listReviewFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: itemKind required: false schema: type: string - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: developerId required: false schema: type: string exclusiveMinimum: 0 pattern: "^[1-9][0-9]*$" - in: query name: destination required: false schema: type: array items: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION - in: query name: state required: false schema: type: array items: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED - in: query name: location required: false schema: type: string enum: - GITHUB - GITLAB - OTHER_WORK - HEPH - SLACK - NEXT_CONVERSATION - PRACTICE_PAGES - in: query name: stopReason required: false schema: type: array items: type: string enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - in: query name: withdrawn required: false schema: type: boolean - in: query name: disagreed required: false schema: type: boolean - in: query name: sort required: false schema: type: string enum: - NEWEST - OLDEST - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOReviewFeedback" description: OK tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/locations: get: operationId: countReviewFeedbackByLocation parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: itemKind required: false schema: type: string - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: developerId required: false schema: type: string exclusiveMinimum: 0 pattern: "^[1-9][0-9]*$" - in: query name: destination required: false schema: type: array items: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION - in: query name: state required: false schema: type: array items: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED - in: query name: location required: false schema: type: string enum: - GITHUB - GITLAB - OTHER_WORK - HEPH - SLACK - NEXT_CONVERSATION - PRACTICE_PAGES - in: query name: stopReason required: false schema: type: array items: type: string enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - in: query name: withdrawn required: false schema: type: boolean - in: query name: disagreed required: false schema: type: boolean - in: query name: sort required: false schema: type: string enum: - NEWEST - OLDEST - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ReasonCount" description: OK tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/reasons: get: operationId: countReviewFeedbackByReason parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: itemKind required: false schema: type: string - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: developerId required: false schema: type: string exclusiveMinimum: 0 pattern: "^[1-9][0-9]*$" - in: query name: destination required: false schema: type: array items: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION - in: query name: state required: false schema: type: array items: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED - in: query name: location required: false schema: type: string enum: - GITHUB - GITLAB - OTHER_WORK - HEPH - SLACK - NEXT_CONVERSATION - PRACTICE_PAGES - in: query name: stopReason required: false schema: type: array items: type: string enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - in: query name: withdrawn required: false schema: type: boolean - in: query name: disagreed required: false schema: type: boolean - in: query name: sort required: false schema: type: string enum: - NEWEST - OLDEST - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ReasonCount" description: OK tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}: get: operationId: getReviewFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewFeedbackDetail" description: OK tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/decisions: get: operationId: listFeedbackDecisions parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/FeedbackDecision" description: OK tags: - feedback-review post: operationId: createFeedbackDecision parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateFeedbackDecisionRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/FeedbackDecision" description: Feedback decision recorded tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/recheck: post: operationId: recheckFeedbackDelivery parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "202": content: application/json: schema: $ref: "#/components/schemas/ReviewFeedbackDetail" description: Feedback delivery recheck accepted tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/retry: post: operationId: retryFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: feedbackId required: true schema: type: string format: uuid responses: "202": content: application/json: schema: $ref: "#/components/schemas/ReviewFeedbackDetail" description: Feedback retry accepted tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/lineage: get: operationId: getReviewLineage parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: kind required: true schema: type: string enum: - ITEM - REVIEW - RESULT - PROBLEM - FEEDBACK - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: resultId required: false schema: type: string format: uuid - in: query name: problemId required: false schema: type: string format: uuid - in: query name: feedbackId required: false schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewLineage" description: OK summary: "Trace an item, review, result, problem or feedback" tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/overview: get: description: "In total, over time and by practice. Reviews count by when they\ \ were created, results by when they were recorded and feedback by when it\ \ was created, as the review, result and feedback lists filter them. The range\ \ is split into days, weeks or months, by its length, in the given time zone." operationId: getReviewOverview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: Inclusive lower bound; defaults to seven days before to. A range spans at most 400 days. in: query name: from required: false schema: type: string format: date-time - description: Exclusive upper bound; defaults to now in: query name: to required: false schema: type: string format: date-time - description: "The IANA time zone whose midnights start the buckets, such as\ \ Europe/Berlin" in: query name: zone required: false schema: type: string default: UTC - description: "True counts all of the workspace's practice reviews: from the\ \ first one's request, whatever from says, so the range may span more than\ \ 400 days. The response's from says where it started." in: query name: allTime required: false schema: type: boolean default: false responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewOverview" description: Practice reviews counted "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Invalid range or time zone summary: "Count practice reviews, results and feedback in a time range" tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/problems: get: operationId: listReviewProblems parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: itemKind required: false schema: type: string - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: developerId required: false schema: type: integer format: int64 - in: query name: outcome required: false schema: type: array items: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE - in: query name: severity required: false schema: type: array items: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - in: query name: currentness required: false schema: type: string enum: - CURRENT - STALE - UNVERIFIABLE - in: query name: markedIncorrect required: false schema: type: boolean - in: query name: accepted required: false schema: type: boolean - in: query name: disagreed required: false schema: type: boolean - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: resultId required: false schema: type: string format: uuid - in: query name: path required: false schema: type: string - in: query name: openOnly required: false schema: type: boolean - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOReviewProblem" description: OK summary: List review problems tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/problems/{problemId}: get: operationId: getReviewProblem parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: problemId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewProblemDetail" description: OK summary: Get a review problem tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/queue: get: description: "How many practice reviews run, wait and are held for budget now,\ \ the oldest wait, the reviews at the head of the queue, and how many reviews\ \ finished in the last hour and the last 24 hours." operationId: getReviewQueue parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewQueue" description: Practice review queue returned summary: Show the practice review queue as it stands now tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/results: get: operationId: listReviewResults parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: reviewId required: false schema: type: string format: uuid - in: query name: itemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: itemKind required: false schema: type: string - in: query name: practiceSlug required: false schema: type: string - in: query name: groupSlug required: false schema: type: string - in: query name: developerId required: false schema: type: integer format: int64 exclusiveMinimum: 0 - in: query name: outcome required: false schema: type: array items: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE - in: query name: severity required: false schema: type: array items: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - in: query name: currentness required: false schema: type: string enum: - CURRENT - STALE - UNVERIFIABLE - in: query name: markedIncorrect required: false schema: type: boolean - in: query name: accepted required: false schema: type: boolean - in: query name: disagreed required: false schema: type: boolean - in: query name: from required: false schema: type: string format: date-time - in: query name: to required: false schema: type: string format: date-time - in: query name: sort required: false schema: type: string default: NEWEST enum: - NEWEST - ACTIONABILITY - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOReviewResult" description: OK summary: List review results tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/results/{resultId}: get: operationId: getReviewResult parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: resultId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewResultDetail" description: OK summary: Get a review result tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/results/{resultId}/marks: get: operationId: listResultMarks parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: resultId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/ResultMark" description: OK summary: List the marks on a result tags: - practice-review-output post: operationId: createResultMark parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: resultId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/CreateResultMarkRequest" required: true responses: "201": content: application/json: schema: $ref: "#/components/schemas/ResultMark" description: Created summary: Mark a result tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/results/{resultId}/marks/{markId}: delete: operationId: removeResultMark parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: resultId required: true schema: type: string format: uuid - in: path name: markId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/RemoveResultMarkRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ResultMark" description: OK summary: Remove a result mark tags: - practice-review-output /workspaces/{workspaceSlug}/practices/reviews/timing: get: description: "The median and 90th percentile of each stage, over the reviews\ \ created in the range as the overview counts them, and the reviews that need\ \ a look. Queue waits and budget holds are counted as they stand now, whenever\ \ the review was requested." operationId: getReviewTiming parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - description: Inclusive lower bound; defaults to seven days before to. A range spans at most 400 days. in: query name: from required: false schema: type: string format: date-time - description: Exclusive upper bound; defaults to now in: query name: to required: false schema: type: string format: date-time - description: "True counts all of the workspace's practice reviews: from the\ \ first one's request, whatever from says, so the range may span more than\ \ 400 days. The response's from says where it started." in: query name: allTime required: false schema: type: boolean default: false responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewTiming" description: Practice reviews measured "400": content: application/problem+json: schema: $ref: "#/components/schemas/ProblemDetail" description: Invalid range summary: Measure how long each stage of the practice reviews in a time range took tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/{reviewId}: get: operationId: getReview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewDetail" description: OK summary: Get a review tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/{reviewId}/cancel: post: operationId: cancelReview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/Review" description: Completed "202": content: application/json: schema: $ref: "#/components/schemas/Review" description: Accepted summary: Cancel a practice review tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/{reviewId}/feedback-checks: get: operationId: listReviewFeedbackChecks parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/FeedbackCheck" description: OK tags: - feedback-review /workspaces/{workspaceSlug}/practices/reviews/{reviewId}/practice-scripts: get: operationId: listReviewPracticeScripts parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeScriptRun" description: OK summary: List scripts executed in a review tags: - Practice reviews /workspaces/{workspaceSlug}/practices/reviews/{reviewId}/usage: get: operationId: getReviewUsage parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: reviewId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ReviewUsage" description: OK summary: Get review usage tags: - Practice reviews /workspaces/{workspaceSlug}/practices/scans: get: operationId: listScans parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: repositoryItemId required: false schema: type: string maxLength: 19 pattern: "^[1-9][0-9]*$" - in: query name: status required: false schema: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOScanSummary" description: OK summary: List repository scans tags: - scan post: operationId: startScan parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: header name: Idempotency-Key required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/StartScanRequest" required: true responses: "202": content: application/json: schema: $ref: "#/components/schemas/ScanSummary" description: Accepted summary: Start a repository scan tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}: get: operationId: getScan parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ScanDetail" description: OK summary: Read a repository scan tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}/report: get: operationId: getScanReport parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid responses: "200": content: application/json: schema: $ref: "#/components/schemas/ScanReport" description: OK summary: Read a scan report tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}/report/items: get: operationId: listScanReportItems parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid - in: query name: cursor required: false schema: type: string - in: query name: size required: false schema: type: integer format: int32 default: 50 maximum: 200 minimum: 1 - in: query name: practiceSlug required: false schema: type: string - in: query name: outcome required: false schema: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE - in: query name: status required: false schema: type: string - in: query name: reused required: false schema: type: boolean - in: query name: path required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/ScanReportItemsPage" description: OK summary: List the items in a scan report tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}/report/problems: get: operationId: listScanReportProblems parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid - in: query name: cursor required: false schema: type: string - in: query name: size required: false schema: type: integer format: int32 default: 50 maximum: 200 minimum: 1 - in: query name: practiceSlug required: false schema: type: string - in: query name: severity required: false schema: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - in: query name: path required: false schema: type: string - in: query name: baselineState required: false schema: type: string enum: - NEW - UNCHANGED - UPDATED - ABSENT - in: query name: openOnly required: false schema: type: boolean default: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ScanReportProblemsPage" description: OK summary: List the problems in a scan report tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}/report/sarif: get: operationId: exportScanSarif parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid responses: "200": content: application/sarif+json: schema: type: string format: binary description: SARIF report summary: Export a scan report as SARIF tags: - scan /workspaces/{workspaceSlug}/practices/scans/{scanId}/status: patch: operationId: updateScanStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: scanId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/CancelScanRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/ScanDetail" description: Completed "202": content: application/json: schema: $ref: "#/components/schemas/ScanDetail" description: Accepted summary: Cancel a repository scan tags: - scan /workspaces/{workspaceSlug}/practices/standings: get: description: "Returns each practice's standing, direction, supporting results,\ \ and developer guidance." operationId: getOwnPracticeStandings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeStanding" description: Practice standings returned summary: List the current developer's practice standings tags: - Practice Standings /workspaces/{workspaceSlug}/practices/tiles: get: operationId: getPracticeWorkspaceTiles parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeWorkspaceTile" description: OK summary: List practice result totals across the workspace tags: - practices-across-workspace /workspaces/{workspaceSlug}/practices/workspace-overview: get: operationId: getPracticeWorkspaceOverview parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeWorkspaceOverview" description: OK summary: Get practice results across the workspace tags: - practices-across-workspace /workspaces/{workspaceSlug}/practices/{practiceSlug}: delete: operationId: deletePractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string responses: "204": description: Practice deleted tags: - practice-catalog get: operationId: getPractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog patch: operationId: updatePractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdatePracticeRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/{practiceSlug}/catalog-customization: delete: operationId: resetPracticeToCatalog parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string - in: header name: If-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/{practiceSlug}/feedback-mode: patch: operationId: setPracticeFeedbackMode parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/SetFeedbackModeRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/{practiceSlug}/group: patch: operationId: movePractice parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/MovePracticeRequest" required: true responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog put: operationId: bindPracticeGroup parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/BindPracticeGroupRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Practice" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/practices/{practiceSlug}/guidance: get: operationId: getPracticeGuidance parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string - in: header name: If-None-Match required: false schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/PracticeGuidanceDTO" description: Practice guidance "304": description: Guidance is unchanged tags: - practice-catalog /workspaces/{workspaceSlug}/practices/{practiceSlug}/versions: get: operationId: listPracticeVersions parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: practiceSlug required: true schema: type: string responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/PracticeVersion" description: OK tags: - practice-catalog /workspaces/{workspaceSlug}/product-feedback: post: operationId: submitWorkspaceProductFeedback parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/FeedbackRequest" required: true responses: "200": description: OK summary: Send product feedback to instance administrators tags: - feedback /workspaces/{workspaceSlug}/product-feedback/surveys: get: operationId: listProductSurveyInvitations parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SurveyInvitation" description: OK summary: List the open surveys the current account has neither answered nor declined tags: - feedback /workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/decline: delete: operationId: undoProductSurveyDecline parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": description: OK summary: Undo a decline; a submitted response is never touched tags: - feedback put: operationId: declineProductSurvey parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": description: OK summary: Decline a survey for the current account tags: - feedback /workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/invitation: put: operationId: acknowledgeProductSurveyInvitation parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: surveyId required: true schema: type: string format: uuid responses: "200": description: OK summary: Record that the invitation was shown to the current account tags: - feedback /workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/responses: post: operationId: submitProductSurveyResponse parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: surveyId required: true schema: type: string format: uuid requestBody: content: application/json: schema: $ref: "#/components/schemas/SubmitSurvey" required: true responses: "200": description: OK summary: Submit a survey response once tags: - feedback /workspaces/{workspaceSlug}/public-activity: get: operationId: getWorkspacePublicActivitySettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityWorkspaceSettings" description: OK summary: Get public activity and search indexing settings tags: - workspace patch: operationId: updatePublicActivity parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspacePublicActivityRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/PublicActivityWorkspaceSettings" description: Workspace updated summary: Turn the public activity page and search indexing on or off tags: - workspace /workspaces/{workspaceSlug}/repositories: delete: operationId: removeRepositoryToMonitor parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: nameWithOwner required: true schema: type: string responses: "200": description: OK summary: Remove a repository from a workspace monitor list tags: - workspace get: operationId: getRepositoriesToMonitor parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: type: string description: Repository list summary: List repositories monitored by a workspace tags: - workspace post: operationId: addRepositoryToMonitor parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: nameWithOwner required: true schema: type: string responses: "200": description: OK summary: Add a repository to a workspace monitor list tags: - workspace /workspaces/{workspaceSlug}/slack/channels: get: operationId: listSlackChannels parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SlackMonitoredChannel" description: OK summary: List the workspace's allow-listed Slack channels with their consent state tags: - Slack channel activation post: operationId: registerSlackChannel parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/RegisterSlackChannelRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/SlackMonitoredChannel" description: OK summary: Allow-list a Slack channel (lands in PENDING; idempotent on the natural key) tags: - Slack channel activation /workspaces/{workspaceSlug}/slack/channels/candidates: get: operationId: listSlackChannelCandidates parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SlackChannelCandidate" description: OK summary: List Slack channels available to add to monitoring tags: - Slack channel activation /workspaces/{workspaceSlug}/slack/channels/{slackChannelId}: patch: operationId: updateSlackChannelConsent parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slackChannelId required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateSlackChannelConsentRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/SlackMonitoredChannel" description: OK summary: Transition a Slack channel to a target consent state (activate / pause / resume / revoke) tags: - Slack channel activation /workspaces/{workspaceSlug}/slack/channels/{slackChannelId}/consent-events: get: operationId: listSlackChannelConsentEvents parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: slackChannelId required: true schema: type: string responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/SlackChannelConsentEvent" description: OK summary: The immutable consent-transition audit trail of one Slack channel tags: - Slack channel activation /workspaces/{workspaceSlug}/slack/me/preferences: patch: operationId: updateSlackUserPreferences parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateSlackUserPreferencesRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/SlackUserWorkspacePreferences" description: OK summary: Update current user's Slack workspace preferences tags: - Slack User Preferences /workspaces/{workspaceSlug}/slug: patch: operationId: renameSlug parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/RenameWorkspaceSlugRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace renamed summary: Rename workspace slug and create redirect tags: - workspace /workspaces/{workspaceSlug}/status: patch: operationId: updateStatus parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspaceStatusRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace updated summary: Update workspace lifecycle status tags: - workspace /workspaces/{workspaceSlug}/team: get: description: Returns all teams in the workspace organization operationId: getAllTeams parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/TeamInfo" description: OK summary: List teams tags: - Teams /workspaces/{workspaceSlug}/team/{id}/visibility: post: description: Show or hide a team in workspace activity operationId: updateTeamVisibility parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: id required: true schema: type: integer format: int64 - in: query name: hidden required: false schema: type: boolean requestBody: content: application/json: schema: type: boolean responses: "200": description: OK summary: Update team visibility tags: - Teams /workspaces/{workspaceSlug}/team/{teamId}/repositories/{repositoryId}/visibility: post: operationId: updateRepositoryVisibility parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: repositoryId required: true schema: type: integer format: int64 - in: query name: hiddenFromContributions required: false schema: type: boolean requestBody: content: application/json: schema: type: boolean responses: "200": description: OK tags: - Teams /workspaces/{workspaceSlug}/teams/{teamId}/labels/{labelId}: delete: operationId: removeLabelFromTeam parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: labelId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/TeamInfo" description: OK summary: Remove a repository label from a team tags: - workspace /workspaces/{workspaceSlug}/teams/{teamId}/labels/{repositoryId}/{label}: post: operationId: addLabelToTeam parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: repositoryId required: true schema: type: integer format: int64 - in: path name: label required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/TeamInfo" description: OK summary: Add a repository label to a team tags: - workspace /workspaces/{workspaceSlug}/teams/{teamId}/settings: get: description: Returns the visibility settings for a team in the workspace operationId: getTeamSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamSettings" description: Team settings returned summary: Get team settings tags: - Team Settings patch: description: Updates the visibility settings for a team in the workspace operationId: updateTeamSettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateTeamSettingsRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamSettings" description: Team settings updated "404": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamSettings" description: Team not found in workspace summary: Update team settings tags: - Team Settings /workspaces/{workspaceSlug}/teams/{teamId}/settings/label-filters: get: description: Returns all labels configured as filters for a team in the workspace operationId: getLabelFilters parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/LabelInfo" description: Label filters returned summary: Get team label filters tags: - Team Settings /workspaces/{workspaceSlug}/teams/{teamId}/settings/label-filters/{labelId}: delete: description: Removes a label filter from a team in the workspace operationId: removeLabelFilter parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: labelId required: true schema: type: integer format: int64 responses: "204": description: Label filter removed "404": description: Label filter not found summary: Remove label filter tags: - Team Settings post: description: Adds a label as a filter for a team in the workspace operationId: addLabelFilter parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: labelId required: true schema: type: integer format: int64 responses: "201": description: Label filter added "404": description: Team or label not found summary: Add label filter tags: - Team Settings /workspaces/{workspaceSlug}/teams/{teamId}/settings/repositories/{repositoryId}: get: description: Returns the contribution visibility settings for a repository in a team operationId: getRepositorySettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: repositoryId required: true schema: type: integer format: int64 responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamRepositorySettings" description: Repository settings returned summary: Get repository settings tags: - Team Settings patch: description: Updates the contribution visibility settings for a repository in a team operationId: updateRepositorySettings parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: teamId required: true schema: type: integer format: int64 - in: path name: repositoryId required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateRepositorySettingsRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamRepositorySettings" description: Repository settings updated "404": content: application/json: schema: $ref: "#/components/schemas/WorkspaceTeamRepositorySettings" description: Team or repository not found summary: Update repository settings tags: - Team Settings /workspaces/{workspaceSlug}/token: patch: operationId: updateToken parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" requestBody: content: application/json: schema: $ref: "#/components/schemas/UpdateWorkspaceTokenRequest" required: true responses: "200": content: application/json: schema: $ref: "#/components/schemas/Workspace" description: Workspace updated summary: Update workspace Personal Access Token tags: - workspace /workspaces/{workspaceSlug}/user-view/users: get: operationId: listUserViewUsers parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: query name: page required: false schema: type: integer format: int32 default: 0 minimum: 0 - in: query name: size required: false schema: type: integer format: int32 default: 25 maximum: 100 minimum: 1 responses: "200": content: application/json: schema: $ref: "#/components/schemas/PageResponseDTOUserViewAccount" description: OK summary: List workspace users and their linked account status tags: - User view /workspaces/{workspaceSlug}/user-view/users/{accountId}: get: operationId: getUserViewUser parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" - in: path name: accountId required: true schema: type: string maximum: 9223372036854776000 pattern: "^[1-9][0-9]*$" - description: "Why the administrator views this account: percent-encoded UTF-8,\ \ 1–500 characters" in: header name: X-User-View-Reason required: true schema: type: string responses: "200": content: application/json: schema: $ref: "#/components/schemas/UserViewAccount" description: OK summary: Confirm access to a workspace user tags: - User view /workspaces/{workspaceSlug}/users: get: operationId: getUsersWithTeams parameters: - description: Workspace slug in: path name: workspaceSlug required: true schema: type: string maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" responses: "200": content: application/json: schema: type: array items: $ref: "#/components/schemas/UserTeams" description: OK summary: List workspace users and the teams they belong to tags: - workspace components: schemas: AcceptPracticeReleaseRequest: type: object properties: choices: type: object additionalProperties: type: string enum: - CURRENT - OFFERED required: - choices AccountAiChoice: type: object description: One account-wide answer; model names belong only to workspace-specific views. properties: choice: type: - string - "null" enum: - NO_AI - IN_HOUSE_ONLY - CLOUD - null updatedAt: type: - string - "null" format: date-time required: - choice - updatedAt AccountAiChoiceRequest: type: object properties: choice: type: string enum: - NO_AI - IN_HOUSE_ONLY - CLOUD required: - choice AccountRef: type: object properties: avatarUrl: type: - string - "null" displayName: type: - string - "null" id: type: string pattern: "^[1-9][0-9]*$" identities: type: array items: $ref: "#/components/schemas/ProviderIdentityRef" status: type: string enum: - UNCLAIMED - ACTIVE - SUSPENDED - DELETING - DELETED required: - avatarUrl - displayName - id - identities - status ActivityAction: type: object description: How often one kind of activity happened on a piece of work properties: count: type: integer format: int32 description: How often it was done example: 3 kind: type: string description: What was done enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED required: - count - kind ActivityBreakdown: type: object properties: approvals: type: integer format: int32 changeRequests: type: integer format: int32 codeComments: type: integer format: int32 commentReviews: type: integer format: int32 discussionComments: type: integer format: int32 issuesClosed: type: integer format: int32 pullRequestsClosed: type: integer format: int32 required: - approvals - changeRequests - codeComments - commentReviews - discussionComments - issuesClosed - pullRequestsClosed ActivityCounts: type: object properties: activeWeeks: type: integer format: int64 comments: type: integer format: int64 contributions: type: integer format: int64 issuesOpened: type: integer format: int64 peopleHelped: type: integer format: int64 pullRequestsMerged: type: integer format: int64 pullRequestsOpened: type: integer format: int64 pullRequestsReviewed: type: integer format: int64 required: - activeWeeks - comments - contributions - issuesOpened - peopleHelped - pullRequestsMerged - pullRequestsOpened - pullRequestsReviewed ActivityCoverage: type: object description: "Completion comes from backfill checkpoints, not the presence of\ \ ledger events." properties: completeRepositories: type: integer format: int64 since: type: string format: date-time totalRepositories: type: integer format: int64 required: - completeRepositories - totalRepositories ActivityFacets: type: object description: "The repositories and teams that workspace activity can be narrowed\ \ to: the lists the people read also carries." properties: repositories: type: array items: $ref: "#/components/schemas/ActivityRepository" teams: type: array items: $ref: "#/components/schemas/ActivityTeam" required: - repositories - teams ActivityHighlights: type: object description: Identifiers refer only to the people in the same response. properties: firstContributors: type: array items: type: integer format: int64 mostPeopleHelped: type: array items: type: integer format: int64 required: - firstContributors - mostPeopleHelped ActivityPeople: type: object properties: automation: type: array items: $ref: "#/components/schemas/ActivityPerson" coverage: $ref: "#/components/schemas/ActivityCoverage" from: type: string format: date-time highlights: $ref: "#/components/schemas/ActivityHighlights" people: type: array items: $ref: "#/components/schemas/ActivityPerson" repositories: type: array items: $ref: "#/components/schemas/ActivityRepository" teams: type: array items: $ref: "#/components/schemas/ActivityTeam" to: type: string format: date-time required: - automation - coverage - from - highlights - people - repositories - teams - to ActivityPerson: type: object properties: counts: $ref: "#/components/schemas/ActivityCounts" firstContributionAt: type: string format: date-time kind: type: string enum: - PERSON - BOT - AUTOMATION person: $ref: "#/components/schemas/UserInfo" weeks: type: array items: $ref: "#/components/schemas/ActivitySparklineWeek" required: - counts - kind - person - weeks ActivityPersonDetail: type: object properties: breakdown: $ref: "#/components/schemas/ActivityBreakdown" counts: $ref: "#/components/schemas/ActivityCounts" firstContributionAt: type: string format: date-time from: type: string format: date-time kind: type: string enum: - PERSON - BOT - AUTOMATION person: $ref: "#/components/schemas/UserInfo" repositories: type: array items: $ref: "#/components/schemas/ActivityRepositoryCounts" to: type: string format: date-time weeks: type: array items: $ref: "#/components/schemas/ActivityWeek" required: - breakdown - counts - from - kind - person - repositories - to - weeks ActivityRepository: type: object description: The full provider path avoids collisions between repositories with the same name. properties: id: type: integer format: int64 key: type: string name: type: string required: - id - key - name ActivityRepositoryCounts: type: object properties: breakdown: $ref: "#/components/schemas/ActivityBreakdown" counts: $ref: "#/components/schemas/ActivityCounts" repository: $ref: "#/components/schemas/ActivityRepository" required: - breakdown - counts - repository ActivitySparklineWeek: type: object properties: contributions: type: integer format: int64 start: type: string format: date-time required: - contributions - start ActivityTeam: type: object properties: id: type: integer format: int64 key: type: string name: type: string parentId: type: integer format: int64 required: - id - key - name ActivityWeek: type: object properties: breakdown: $ref: "#/components/schemas/ActivityBreakdown" counts: $ref: "#/components/schemas/ActivityCounts" start: type: string format: date-time required: - breakdown - counts - start ActivityWork: type: object description: The activity on one pull request or issue in a time range properties: actions: type: array description: "Each kind of activity that happened on it, in a fixed order\ \ of kinds" items: $ref: "#/components/schemas/ActivityAction" id: type: string description: "Identifier of the group: work:,\ \ or event: for activity whose pull request or issue\ \ is not known" lastOccurredAt: type: string format: date-time description: When the latest of this activity happened people: type: array description: "Everyone this activity counts for, by name" items: $ref: "#/components/schemas/UserInfo" work: $ref: "#/components/schemas/WorkItem" description: "The pull request or issue; null when it, or the review or\ \ comment the activity was, is no longer known or was deleted upstream" required: - actions - id - lastOccurredAt - people ActivityWorkPage: type: object description: "One page of activity grouped by the pull request or issue it happened\ \ on, latest first" properties: content: type: array description: "The work on this page, by its latest activity, newest first" items: $ref: "#/components/schemas/ActivityWork" nextCursor: type: string description: Opaque cursor that fetches the next page when passed back as cursor; absent on the last page required: - content AdminAccountView: type: object properties: appRole: type: string enum: - USER - APP_ADMIN displayName: type: string id: type: integer format: int64 primaryEmail: type: string status: type: string enum: - UNCLAIMED - ACTIVE - SUSPENDED - DELETING - DELETED required: - appRole - status AdminLlmUsageReport: type: object description: "Instance-admin per-workspace month rollup (metadata only, no tenant\ \ content)" properties: fx: $ref: "#/components/schemas/FxRateInfo" description: Display-only conversion when the instance has a display currency. Absent = show USD only. Applies to every USD amount in this response. month: type: string description: "Calendar month (UTC), ISO yyyy-MM" example: 2026-07 workspaces: type: array description: "One row per workspace, including workspaces with no ledger\ \ activity this month" items: $ref: "#/components/schemas/AdminWorkspaceLlmUsage" required: - month - workspaces AdminWorkspaceLlmUsage: type: object description: "One workspace's month of spend, as an instance admin sees it" properties: displayName: type: string events: type: integer format: int64 description: "Runs this month, either purse: job attempts and mentor turns.\ \ Rows of models for practice scripts are not runs." instanceBudgetVerdict: type: string description: "Whether shared-model spend is within the instance cap, has\ \ reached it, or cannot be confirmed because shared-model rates are missing\ \ or usage measurements are unverified." enum: - WITHIN - EXHAUSTED - UNVERIFIABLE instanceMonthlyBudgetUsd: type: number format: decimal description: Monthly cap in USD on this workspace's spend on shared (instance) models — the money this instance pays for; null = uncapped. Yours to set. instancePaused: type: boolean description: "Whether work on SHARED models is paused for this workspace\ \ right now (current month only) — authoritative, mirroring the live gate." instanceTotalCostUsd: type: number format: decimal description: "This month's confirmed spend on shared (instance) models,\ \ in USD — compared against instanceMonthlyBudgetUsd." ownProviderBudgetVerdict: type: string description: The same verdict for the workspace's own-provider spend against its own cap. enum: - WITHIN - EXHAUSTED - UNVERIFIABLE ownProviderInUse: type: boolean description: Whether this month has an own-provider purse to show for the workspace. Same rule as WorkspaceLlmUsageReport.ownProviderInUse. ownProviderMonthlyBudgetUsd: type: number format: decimal description: "The workspace's own cap in USD on its own-provider spend;\ \ null = uncapped. Read-only here — it governs the workspace's money,\ \ so only its own admins may change it." ownProviderPaused: type: boolean description: Whether work on the workspace's OWN provider is paused right now. ownProviderTotalCostUsd: type: number format: decimal description: "This month's confirmed spend on the workspace's own connected\ \ provider(s), in USD — compared against ownProviderMonthlyBudgetUsd." workspaceSlug: type: string description: "Addresses the workspace everywhere else in the API, including\ \ its cap" required: - displayName - events - instanceBudgetVerdict - instancePaused - instanceTotalCostUsd - ownProviderBudgetVerdict - ownProviderInUse - ownProviderPaused - ownProviderTotalCostUsd - workspaceSlug AdminWorkspaceView: type: object description: Metadata-only workspace summary for the instance-admin overview properties: accountLogin: type: string createdAt: type: string format: date-time displayName: type: string id: type: integer format: int64 memberCount: type: integer format: int64 ownerLogin: type: string providerType: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE status: type: string enum: - ACTIVE - SUSPENDED - PURGED workspaceSlug: type: string required: - accountLogin - createdAt - displayName - id - memberCount - status - workspaceSlug AdmissionRequest: type: object properties: attempt: type: integer format: int32 contractVersion: type: integer format: int32 jobId: type: string format: uuid nonResults: type: array items: $ref: "#/components/schemas/RuntimeNonResult" results: type: array items: $ref: "#/components/schemas/SubmittedResult" reviewId: type: string format: uuid required: - nonResults AdmissionResponse: type: object properties: admissionDigest: type: string admitted: type: array items: $ref: "#/components/schemas/AdmittedResult" attempt: type: integer format: int32 contractVersion: type: integer format: int32 conversationEligibility: anyOf: - $ref: "#/components/schemas/ConversationEligibility" - type: "null" jobId: type: string format: uuid practicePageSupport: anyOf: - $ref: "#/components/schemas/PracticePageSupport" - type: "null" privateHistory: anyOf: - $ref: "#/components/schemas/PrivateFeedbackHistory" - type: "null" privatePrepared: type: boolean publicReviewed: type: boolean reviewId: type: string format: uuid withheld: type: array items: $ref: "#/components/schemas/Withheld" required: - admissionDigest - admitted - attempt - contractVersion - conversationEligibility - jobId - practicePageSupport - privateHistory - privatePrepared - publicReviewed - reviewId - withheld AdmittedProblem: type: object properties: basis: anyOf: - oneOf: - $ref: "#/components/schemas/DutyBasis" - $ref: "#/components/schemas/IntroducedBasis" - $ref: "#/components/schemas/StateBasis" - $ref: "#/components/schemas/WorsenedBasis" - type: "null" citations: type: array items: $ref: "#/components/schemas/ProjectedCitation" explanation: type: - string - "null" id: type: string format: uuid key: type: - string - "null" nextStep: type: - string - "null" position: type: integer format: int32 publicEligible: type: boolean resultId: type: string format: uuid severity: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL summary: type: string required: - basis - citations - explanation - id - key - nextStep - position - publicEligible - resultId - severity - summary AdmittedResult: type: object properties: coverage: oneOf: - $ref: "#/components/schemas/ClaimedCoverage" - $ref: "#/components/schemas/HostCoverage" evidence: $ref: "#/components/schemas/JsonNode" example: anyOf: - $ref: "#/components/schemas/JsonNode" - type: "null" explanation: type: - string - "null" itemId: type: string outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceSlug: type: string problems: type: array items: $ref: "#/components/schemas/AdmittedProblem" publicEligible: type: boolean resultId: type: string format: uuid summary: type: - string - "null" summaryOnly: type: boolean required: - coverage - evidence - example - explanation - itemId - outcome - practiceSlug - problems - publicEligible - resultId - summary - summaryOnly AgentBinding: type: object description: A workspace's agent binding for one purpose properties: allowInternet: type: boolean dataHandlingTier: type: string enum: - IN_HOUSE - CLOUD - UNDECLARED enabled: type: boolean instanceModelId: type: integer format: int64 maxConcurrentJobs: type: integer format: int32 purpose: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING ready: type: boolean description: True when the bound model is available to run right now servedTiers: type: array description: "The members this binding serves now, named by the tier of\ \ their choice: IN_HOUSE and CLOUD for the members who chose them, UNDECLARED\ \ for the members who have not chosen. A decision, embedding or reranking\ \ binding serves no member whose review model is stricter. Empty when\ \ the binding serves no member." items: type: string enum: - IN_HOUSE - CLOUD - UNDECLARED timeoutSeconds: type: integer format: int32 workspaceModelId: type: integer format: int64 required: - dataHandlingTier - enabled - purpose - ready - servedTiers AgentBindingRequest: type: object description: Bind a model and execution limits to an agent purpose properties: allowInternet: type: boolean description: Whether the sandbox may reach the public internet enabled: type: boolean description: Whether this purpose is active (paused when false) instanceModelId: type: integer format: int64 description: Shared (instance-catalog) model id to run this purpose on maxConcurrentJobs: type: integer format: int32 description: Maximum concurrent runs for this purpose minimum: 1 timeoutSeconds: type: integer format: int32 description: Per-run timeout in seconds (30–10800; three hours is the longest a single run may take) maximum: 10800 minimum: 30 workspaceModelId: type: integer format: int64 description: Workspace-owned model id to run this purpose on AiChoiceRequest: type: object properties: choice: type: string enum: - NO_AI - IN_HOUSE_ONLY - CLOUD required: - choice Answer: type: object description: One answer; exactly the field matching the question's type is set. properties: choices: type: array items: type: string maxLength: 200 minLength: 0 maxItems: 20 minItems: 0 questionId: type: string maxLength: 80 minLength: 0 rating: type: integer format: int32 maximum: 10 minimum: 0 text: type: string maxLength: 4000 minLength: 0 required: - questionId AppliesWhen: type: object properties: anyOf: type: array items: $ref: "#/components/schemas/AppliesWhenClause" otherwise: type: string required: - anyOf - otherwise AppliesWhenClause: type: object properties: changedPath: type: array items: type: string diffContains: type: array items: type: string hasItems: type: string AssignRoleRequest: type: object properties: accountId: type: string pattern: "^[1-9][0-9]*$" role: type: string enum: - OWNER - ADMIN - MEMBER required: - accountId - role AuthAuditAccount: type: object description: |- A human-readable account identity. displayName/email are null for deleted accounts. properties: displayName: type: string email: type: string id: type: integer format: int64 required: - id AuthEventView: type: object description: "One audit row, flattened for the admin viewer." properties: account: $ref: "#/components/schemas/AuthAuditAccount" accountId: type: integer format: int64 actingAccountId: type: integer format: int64 actor: $ref: "#/components/schemas/AuthAuditAccount" details: type: string elevatedViaInstanceAdmin: type: boolean eventType: type: string failureReason: type: string id: type: integer format: int64 ipAddress: type: string occurredAt: type: string format: date-time result: type: string userAgent: type: string viewedAccountId: type: integer format: int64 viewedActorId: type: integer format: int64 workspaceId: type: integer format: int64 required: - elevatedViaInstanceAdmin - eventType - id - occurredAt - result AvailableLlmModel: type: object description: A model available for this workspace to bind a Task to properties: brand: type: string description: Model brand declared by an admin; display only enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT connectionDisplayName: type: string description: Owning connection's display name dataHandlingTier: type: string description: Data-handling tier derived from the admin's declared facts enum: - IN_HOUSE - CLOUD - UNDECLARED displayName: type: string description: Human-readable name id: type: integer format: int64 description: "Model id, unique within its scope" per1mCacheReadUsd: type: number format: decimal description: Cache-read rate per 1M tokens (USD) per1mCacheWriteUsd: type: number format: decimal description: Cache-write rate per 1M tokens (USD) per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD) per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD) pricingMode: type: string description: Pricing mode enum: - PRICED - NO_CHARGE - UNPRICED purposes: type: array description: "The purposes a binding may assign this model to, from its\ \ connection's protocol" items: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING reasoningEffort: type: string description: "Reasoning effort requested of the model; null sends none,\ \ the provider's default applies" enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX scope: type: string description: SHARED (instance catalog) or WORKSPACE (your own provider) enum: - SHARED - WORKSPACE required: - connectionDisplayName - dataHandlingTier - displayName - id - pricingMode - purposes - scope BackfillSummary: type: object description: Connection-level backfill rollup properties: percent: type: integer format: int32 description: "0-100 completion estimate, if computable" state: type: string description: Integration-defined backfill state string required: - state Basis: type: object properties: outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceSlug: type: string practiceVersionId: type: - string - "null" resultId: type: string format: uuid required: - outcome - practiceSlug - practiceVersionId - resultId BindPracticeGroupRequest: type: object properties: groupSlug: type: - string - "null" required: - groupSlug BoundModelSlot: type: object properties: kind: type: string enum: - CHAT - DECISION - EMBEDDING - RERANKING model: anyOf: - $ref: "#/components/schemas/FrozenModel" - type: "null" slot: type: string required: - kind - model - slot CancelScanRequest: type: object properties: status: type: string enum: - CANCELLED required: - status Catalog: type: object properties: groups: type: array items: $ref: "#/components/schemas/CatalogGroup" practices: type: array items: $ref: "#/components/schemas/CatalogPractice" required: - groups - practices CatalogAdoptionGroup: type: object properties: definition: $ref: "#/components/schemas/GroupDefinition" disposition: type: string enum: - UNASSIGNED - REUSE_EXISTING_GROUP - CREATE_CATALOG_GROUP slug: type: string CatalogGroup: type: object properties: changeKind: type: string enum: - NONE - WORDING - PRESENTATION - REVIEW color: type: - string - "null" description: type: - string - "null" etag: type: string excluded: type: boolean icon: type: - string - "null" name: type: string offered: type: boolean position: type: integer format: int32 shipped: anyOf: - $ref: "#/components/schemas/GroupDefinition" - type: "null" slug: type: string state: type: string enum: - FROM_HEPHAESTUS - EDITED_HERE - UPDATE_WAITING - YOURS - NO_LONGER_SHIPPED required: - changeKind - color - description - etag - excluded - icon - name - offered - position - shipped - slug - state CatalogGroupAdoptionPreview: type: object properties: actions: type: array items: $ref: "#/components/schemas/CatalogGroupPracticeAction" definition: $ref: "#/components/schemas/GroupDefinition" disposition: type: string enum: - UNASSIGNED - REUSE_EXISTING_GROUP - CREATE_CATALOG_GROUP etag: type: string practices: type: array items: $ref: "#/components/schemas/CatalogPracticePreview" slug: type: string CatalogGroupAdoptionResult: type: object properties: added: type: array items: $ref: "#/components/schemas/Practice" moved: type: array items: $ref: "#/components/schemas/Practice" required: - added - moved CatalogGroupInput: type: object properties: color: type: - string - "null" maxLength: 32 minLength: 0 description: type: - string - "null" maxLength: 2000 minLength: 0 icon: type: - string - "null" maxLength: 64 minLength: 0 name: type: string maxLength: 128 minLength: 0 position: type: - "null" - integer format: int32 minimum: 0 slug: type: string maxLength: 64 minLength: 0 pattern: "[a-z0-9]+(?:-[a-z0-9]+)*" required: - color - description - icon - name - position - slug CatalogGroupPracticeAction: type: object properties: action: type: string enum: - ADD - MOVE_TO_GROUP - KEEP - BLOCKED slug: type: string required: - action - slug CatalogGroupUpdate: type: object properties: color: type: - string - "null" maxLength: 32 minLength: 0 description: type: - string - "null" maxLength: 2000 minLength: 0 icon: type: - string - "null" maxLength: 64 minLength: 0 name: type: string maxLength: 128 minLength: 0 position: type: - "null" - integer format: int32 minimum: 0 required: - color - description - icon - name - position CatalogOrigin: type: object properties: catalogSlug: type: - string - "null" localEdits: type: array items: type: string enum: - NAME - REVIEW_ON - APPLIES_WHEN - ABOUT - READS - REVIEWED_BY - CRITERIA - SCRIPT - SCAN - LINE_NOTES - GUIDANCE offeredDigest: type: - string - "null" state: type: string enum: - FROM_HEPHAESTUS - EDITED_HERE - UPDATE_WAITING - YOURS - NO_LONGER_SHIPPED required: - catalogSlug - localEdits - offeredDigest - state CatalogPractice: type: object properties: changeKind: type: string enum: - NONE - WORDING - PRESENTATION - REVIEW definition: $ref: "#/components/schemas/PracticeDefinition" etag: type: string excluded: type: boolean groupSlug: type: - string - "null" kind: type: string offered: type: boolean position: type: integer format: int32 shipped: anyOf: - $ref: "#/components/schemas/PracticeDefinition" - type: "null" slug: type: string state: type: string enum: - FROM_HEPHAESTUS - EDITED_HERE - UPDATE_WAITING - YOURS - NO_LONGER_SHIPPED required: - changeKind - definition - etag - excluded - groupSlug - kind - offered - position - shipped - slug - state CatalogPracticeInput: type: object properties: definition: $ref: "#/components/schemas/PracticeDefinitionInput" groupSlug: type: - string - "null" kind: type: string pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*" position: type: - "null" - integer format: int32 minimum: 0 slug: type: string maxLength: 64 minLength: 0 pattern: "[a-z0-9]+(?:-[a-z0-9]+)*" required: - definition - groupSlug - kind - position - slug CatalogPracticePreview: type: object properties: availability: type: string enum: - AVAILABLE - ADOPTED - SLUG_CONFLICT definition: $ref: "#/components/schemas/PracticeDefinition" etag: type: string group: $ref: "#/components/schemas/CatalogAdoptionGroup" initialFeedbackMode: type: string enum: - "OFF" - APPROVE_FIRST - AUTOMATIC kind: type: string offeredDigest: type: string slug: type: string CatalogPracticeSummary: type: object properties: availability: type: string enum: - AVAILABLE - ADOPTED - SLUG_CONFLICT groupName: type: string groupSlug: type: string kind: type: string name: type: string reviewedBy: $ref: "#/components/schemas/ReviewedBy" slug: type: string whyItMatters: type: string CatalogPracticeUpdate: type: object properties: definition: $ref: "#/components/schemas/PracticeDefinitionInput" groupSlug: type: - string - "null" kind: type: string pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*" position: type: - "null" - integer format: int32 minimum: 0 required: - definition - groupSlug - kind - position ChatMessage: type: object description: Mentor chat message in AI SDK UIMessage shape. properties: createdAt: type: string format: date-time id: type: string format: uuid metadata: type: object additionalProperties: {} description: "Per-turn metadata: status, model, costUsd, usage, …" parentMessageId: type: string format: uuid parts: type: array items: description: AI SDK UIMessage part (text / data-result). role: type: string ChatMessageVote: type: object description: User vote on a mentor assistant message. properties: isUpvoted: type: boolean messageId: type: string format: uuid updatedAt: type: string format: date-time ChatMessageVoteRequest: type: object description: Upsert a vote on a mentor assistant message properties: isUpvoted: type: boolean description: "true = upvote (helpful), false = downvote" required: - isUpvoted ChatThreadDetail: type: object description: Mentor chat thread with all messages and the owner's votes on them. properties: createdAt: type: string format: date-time id: type: string format: uuid messages: type: array items: $ref: "#/components/schemas/ChatMessage" title: type: string votes: type: object additionalProperties: type: boolean ChatThreadSummary: type: object description: Mentor chat thread summary (no messages). properties: createdAt: type: string format: date-time id: type: string format: uuid title: type: string required: - createdAt - id CitationCapabilities: type: object properties: commit: type: string enum: - REQUIRED - OPTIONAL - FORBIDDEN side: type: string enum: - REQUIRED - OPTIONAL - FORBIDDEN CitationProof: type: object properties: itemSha256: type: string quoteSha256: type: string status: type: string enum: - VERIFIED CitationProofDTO: type: object properties: itemSha256: type: string quoteSha256: type: string status: type: string enum: - VERIFIED required: - itemSha256 - quoteSha256 - status ClaimBasis: discriminator: propertyName: type properties: type: type: string required: - type ClaimedCoverage: allOf: - $ref: "#/components/schemas/ResultCoverage" - type: object properties: checked: type: integer format: int32 complete: type: boolean omitted: type: array items: $ref: "#/components/schemas/CoverageOmission" selected: type: integer format: int32 total: type: integer format: int32 ClientRefreshRequest: type: object properties: refreshToken: type: string pattern: "^[A-Za-z0-9_-]{43}$" required: - refreshToken ClientSessionTokens: type: object properties: accessToken: type: string accessTokenExpiresAt: type: string format: date-time refreshToken: type: string sessionExpiresAt: type: string format: date-time required: - accessToken - accessTokenExpiresAt - refreshToken - sessionExpiresAt ClientSignInConfiguration: type: object properties: registered: type: boolean required: - registered ClientTokenRequest: type: object properties: clientId: type: string pattern: "^[a-p]{32}$" code: type: string pattern: "^[A-Za-z0-9_-]{43}$" codeVerifier: type: string pattern: "^[A-Za-z0-9._~-]{43,128}$" redirectUri: type: string maxLength: 200 minLength: 0 required: - clientId - code - codeVerifier - redirectUri ClosedPracticePageSupport: type: object properties: readAt: type: string format: date-time refusal: type: - string - "null" state: type: string enum: - UNAVAILABLE - REFUSED required: - readAt - refusal - state CompletePracticePageSupport: type: object properties: practices: type: array items: $ref: "#/components/schemas/PracticeSupport" readAt: type: string format: date-time state: type: string enum: - COMPLETE required: - practices - readAt - state ComposedFeedback: type: object properties: destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION notes: type: array items: $ref: "#/components/schemas/Note" page: $ref: "#/components/schemas/Page" resultIds: type: array items: type: string format: uuid summary: type: string trace: $ref: "#/components/schemas/FeedbackCompositionTrace" withheldReason: type: string enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED ConfigAuditActorRef: type: object description: |- A human-readable actor identity on an audit row. Resolved at read time, so an erased account degrades here without the trail being rewritten: AccountPurger clears the email, replaces the display name with a placeholder, and nulls the row's actor references.

Named distinctly from the auth trail's own AccountRefDTO: the OpenAPI schema key is the simple name minus the DTO suffix, so two AccountRefDTO records would collide and one would be silently dropped from the spec. properties: displayName: type: string email: type: string id: type: integer format: int64 required: - id ConfigAuditEntryView: type: object description: "One audit row, flattened for a viewer. Crosses the module boundary,\ \ so it carries no entity." properties: actingAccountId: type: integer format: int64 actingActor: $ref: "#/components/schemas/ConfigAuditActorRef" description: "resolved impersonator, present only for {@link ConfigAuditActorKind#IMPERSONATED\ \ ConfigAuditActorKind#IMPERSONATED}" action: type: string enum: - CREATED - UPDATED - DELETED actor: $ref: "#/components/schemas/ConfigAuditActorRef" description: |- resolved identity of actorAccountId; null for SYSTEM rows or once the account is gone. Read together with actorKind — that is what keeps "a system did this" distinct from "we no longer know who did this". actorAccountId: type: integer format: int64 actorKind: type: string enum: - USER - SYSTEM - IMPERSONATED changedKeys: type: array description: dot-paths that differ between oldValue and newValue items: type: string elevatedViaInstanceAdmin: type: boolean description: whether the actor reached this workspace by instance-admin elevation entityId: type: string entityType: type: string enum: - PRACTICE_REVIEW_SETTINGS - AGENT_BINDING - AGENT_CONFIG - AI_CONFIG_BINDING - WORKSPACE_ROLE - ACTIVITY_AUTOMATION - WORKSPACE_FEATURES - WORKSPACE_STATUS - WORKSPACE_TOKEN - WORKSPACE_VISIBILITY - PRACTICE_ACTIVE - PRACTICE_USAGE - PRACTICE_DEFINITION - PRACTICE_GROUP - CATALOG_PRACTICE - CATALOG_GROUP - WORKSPACE_INSTANCE_LLM_BUDGET - WORKSPACE_OWN_PROVIDER_LLM_BUDGET - WORKSPACE_LLM_BUDGET - WORKSPACE_BYO_LLM_BUDGET - REVIEW_BATCH - REVIEW_SCHEDULE - FEEDBACK_DELIVERY_RECHECK - WORKSPACE_LLM_CONNECTION - WORKSPACE_LLM_MODEL id: type: integer format: int64 newValue: type: string occurredAt: type: string format: date-time oldValue: type: string workspaceId: type: integer format: int64 required: - elevatedViaInstanceAdmin ConfigurationFact: type: object properties: documentationUrl: type: string explanation: type: string id: type: string requirement: type: string enum: - REQUIRED - RECOMMENDED - OPTIONAL roles: type: array items: type: string enum: - SERVER - WORKER - WEBHOOK status: type: string enum: - SATISFIED - ACTION_REQUIRED - NOT_CONFIGURED - NOT_APPLICABLE subject: type: string required: - documentationUrl - explanation - id - requirement - roles - status - subject ConnectionAuditEntry: type: object description: |- Audit-log entry returned by GET /workspaces/{workspaceSlug/connections/{id}/audit}.

Lean projection of {@link ConnectionAudit ConnectionAudit} — the entity carries a back-reference to Connection that this DTO omits. properties: actorAccountId: type: integer format: int64 actorKind: type: string actorRef: type: string correlationId: type: string eventType: type: string fromState: type: string enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED occurredAt: type: string format: date-time toState: type: string enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED ConnectionDetail: type: object description: |- Detailed view of a single Connection — extends {@link ConnectionSummaryDTO ConnectionSummaryDTO} with the sealed config serialized to a free-form JSON object (Map<String, Object> → type: object, additionalProperties: true in the spec, so it round-trips through client codegen). NEVER carries credentials: the encrypted credential blob stays inside the entity, and every secret-bearing key of the config itself is stripped by redactSensitive before serialization.

Why redact here and not with @JsonIgnore on the record component? The very same ObjectMapper bean serializes ConnectionConfig into the JSONB connection.config column (Hibernate's json_format_mapper is wired to it in HibernateJacksonFormatMapperConfig). Annotating the component would therefore drop the secret on write and destroy the stored value — the API-boundary filter below is the only place the two concerns can be separated.

Mirroring the summary fields (rather than embedding the summary record) keeps the JSON shape flat — the API consumer sees one record, not a nested summary object. properties: attentionProblem: type: string enum: - CREDENTIAL_EXPIRING - CREDENTIAL_REVOKED - PROVIDER_SUSPENDED capabilities: type: array items: type: string enum: - WEBHOOK_INGEST - TOKEN_REFRESH - FEEDBACK_DELIVERY - INLINE_FEEDBACK - APPROVAL_WORKFLOW - SCOPE_CHANGES uniqueItems: true config: type: object additionalProperties: {} createdAt: type: string format: date-time credentialsUnreadableSince: type: string format: date-time displayName: type: string family: type: string enum: - SCM - MESSAGING - DOCUMENTATION id: type: integer format: int64 instanceKey: type: string kind: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE state: type: string enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED stateReason: type: string tokenExpiresAt: type: string format: date tokenExpiryCheckedAt: type: string format: date-time updatedAt: type: string format: date-time ConnectionSummary: type: object description: |- Wire shape returned by the GET /workspaces/{workspaceSlug/connections} list + by lifecycle endpoints (suspend, reactivate). Lightweight — no config, no credentials, no audit. Capabilities are looked up from the per-kind manifest at response build time so adding/removing a capability needs no DB migration. properties: capabilities: type: array items: type: string enum: - WEBHOOK_INGEST - TOKEN_REFRESH - FEEDBACK_DELIVERY - INLINE_FEEDBACK - APPROVAL_WORKFLOW - SCOPE_CHANGES uniqueItems: true createdAt: type: string format: date-time credentialsUnreadableSince: type: string format: date-time displayName: type: string family: type: string enum: - SCM - MESSAGING - DOCUMENTATION id: type: integer format: int64 instanceKey: type: string kind: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE state: type: string enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED stateReason: type: string updatedAt: type: string format: date-time ConnectionSyncStatus: type: object description: Unified sync-observability status for one connection properties: activeJob: $ref: "#/components/schemas/SyncJob" description: "Currently PENDING/RUNNING job, if any" backfill: $ref: "#/components/schemas/BackfillSummary" description: "Connection-level backfill rollup, if applicable" backfillSupported: type: boolean description: "Whether this kind's runner offers an explicitly triggerable\ \ backfill pass. Reflects the vendor capability only — the scheduled-backfill\ \ flag does not gate it, so a manual backfill stays available while the\ \ automatic cycle is administratively paused." connectionId: type: integer format: int64 description: Connection id connectionState: type: string description: Raw connection lifecycle state enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED health: type: string description: Derived health enum: - PENDING - HEALTHY - DEGRADED - FAILED - SUSPENDED kind: type: string description: Integration kind enum: - GITHUB - GITLAB - SLACK - OUTLINE lastEventProcessedAt: type: string format: date-time description: "When the last inbound webhook/event was processed for this\ \ connection, if any" lastJob: $ref: "#/components/schemas/SyncJob" description: "Most recently finished job, if any" lastSuccessfulSyncAt: type: string format: date-time description: Most recent successful job's finish time nextScheduledSyncAt: type: string format: date-time description: When the next periodic reconciliation is expected rateLimit: $ref: "#/components/schemas/RateLimitSnapshot" description: "Current rate-limit budget, if known" resourceCounts: $ref: "#/components/schemas/ResourceCounts" description: Resource-level rollup syncIntervalSeconds: type: integer format: int64 description: "The periodic reconciliation's cadence in seconds, when the\ \ schedule has a regular one. This is what makes a resource's lastSyncedAt\ \ judgeable: \"synced 4h ago\" is only stale if the cadence is hourly,\ \ and a client cannot know that without this. Null when the schedule is\ \ irregular or unparseable — clients must then decline to judge staleness\ \ rather than assume a default, exactly as the server's own stale rollup\ \ does." webhookRegistered: type: boolean description: Whether the vendor webhook registration is present; null if not applicable/unknown required: - backfillSupported - connectionId - connectionState - health - kind - resourceCounts ConsentStatus: type: object properties: completed: type: boolean noticeVersion: type: string description: Version of the first-login wording the client must be rendering participateInResearch: type: boolean researchOrganization: type: string description: "Organization that runs the optional research program, or null\ \ when this instance runs none" required: - completed - noticeVersion - participateInResearch Contributor: type: object description: Information about a contributor to the Hephaestus project properties: avatarUrl: type: string description: URL to the contributor's avatar image contributions: type: integer format: int32 description: Number of contributions to the project example: 42 htmlUrl: type: string description: URL to the contributor's GitHub profile id: type: integer format: int64 description: GitHub user ID login: type: string description: GitHub username name: type: string description: Display name of the contributor required: - avatarUrl - htmlUrl - id - login - name ConversationEligibility: type: object properties: readAt: type: string format: date-time results: type: array items: $ref: "#/components/schemas/ResultDecision" state: type: string enum: - COMPLETE - UNAVAILABLE - REFUSED required: - readAt - results - state Copy: type: object properties: body: type: - string - "null" endLine: type: - "null" - integer format: int32 externalRef: type: - string - "null" externalUrl: type: - string - "null" id: type: string format: uuid kind: type: string enum: - SUMMARY - LINE_NOTE - FILE_NOTE - CHAT_TURN path: type: - string - "null" postedAt: type: string format: date-time side: type: - string - "null" enum: - OLD - NEW - null startLine: type: - "null" - integer format: int32 state: type: string enum: - PLANNED - WRITE_STARTED - POSTED - FAILED - WITHHELD - RETRACTED required: - body - endLine - externalRef - externalUrl - id - kind - path - postedAt - side - startLine - state CopySupport: type: object properties: basedOn: type: array items: $ref: "#/components/schemas/Support" kind: type: string enum: - SUMMARY - LINE_NOTE - FILE_NOTE - CHAT_TURN position: type: integer format: int32 Coverage: type: object properties: hasMore: type: boolean description: older matching feedback exists beyond maxEntries maxEntries: type: integer format: int32 omittedWithoutCopyAuthority: type: integer format: int32 description: matching feedback left out because its support may not be copied here CoverageOmission: type: object properties: count: type: integer format: int32 items: type: array items: type: string reason: type: string enum: - selection - truncated - unavailable - budget - deadline - too-large - off-format - refused - error - cancelled what: type: string CreateFeedbackDecisionRequest: type: object properties: action: type: string enum: - APPROVE - REJECT - WITHDRAW - RESTORE contentDigest: type: string pattern: "^[0-9a-f]{64}$" note: type: string maxLength: 500 minLength: 0 reasonCode: type: string enum: - INCORRECT - MISSING_CONTEXT - UNHELPFUL - DUPLICATE - INAPPROPRIATE_LOCATION - OTHER required: - action CreateLlmConnectionRequest: type: object description: Create an instance LLM provider connection properties: apiKey: type: string description: API key (write-only; never returned) apiProtocol: type: string description: Wire protocol enum: - openai-completions - openai-responses - openai-decisions - openai-embeddings - cohere-rerank example: openai-responses authMode: type: string description: Credential shape (default BEARER) enum: - BEARER - API_KEY baseUrl: type: string description: Provider base URL maxLength: 2048 minLength: 0 connectionPlatform: type: string description: Admin-declared connection platform; null when not declared enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the connection is enabled (default false) slug: type: string description: Optional internal slug; generated from displayName when omitted maxLength: 63 minLength: 0 required: - apiProtocol - baseUrl - displayName CreateLlmModelRequest: type: object description: Create a model on an instance LLM connection properties: brand: type: string description: Model brand declared by an admin; display only enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT contextWindow: type: integer format: int32 description: Context window in tokens minimum: 1 dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" maxLength: 200 minLength: 0 displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the model is active (default false) maxOutputTokens: type: integer format: int32 description: Maximum output tokens minimum: 1 operatedBy: type: string description: Who operates the systems the work is sent to; omit to leave the model undeclared enum: - OWN_ORGANISATION - PROVIDER reasoningEffort: type: string description: "Reasoning effort to request; null sends none, so the provider's\ \ own default applies" enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX slug: type: string description: Optional internal slug; generated from displayName when omitted maxLength: 63 minLength: 0 upstreamModelId: type: string description: Upstream provider model id maxLength: 256 minLength: 0 required: - displayName - upstreamModelId CreateLoginProviderRequest: type: object properties: baseUrl: type: string description: Instance base URL (GitLab only; GitHub is always github.com) example: https://gitlab.example.com clientId: type: string minLength: 1 clientSecret: type: string description: "OAuth client secret; sealed at rest, never returned" minLength: 1 displayName: type: string description: Label shown on the login button; defaults to the registrationId registrationId: type: string description: Stable id used in the OAuth callback path and identity resolution example: gitlab-acme minLength: 1 scopes: type: string description: Space-separated scopes; defaulted by provider type if omitted type: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE required: - clientId - clientSecret - registrationId - type CreatePracticeGroupRequest: type: object properties: color: type: - string - "null" maxLength: 32 minLength: 0 description: type: - string - "null" maxLength: 2000 minLength: 0 icon: type: - string - "null" maxLength: 64 minLength: 0 name: type: string maxLength: 128 minLength: 0 position: type: - "null" - integer format: int32 minimum: 0 shownToDevelopers: type: boolean slug: type: string maxLength: 64 minLength: 0 pattern: "[a-z0-9]+(?:-[a-z0-9]+)*" required: - color - description - icon - name - position - shownToDevelopers - slug CreatePracticeRequest: type: object properties: definition: $ref: "#/components/schemas/PracticeDefinitionInput" groupSlug: type: - string - "null" kind: type: string pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*" position: type: - "null" - integer format: int32 minimum: 0 slug: type: string maxLength: 64 minLength: 0 pattern: "[a-z0-9]+(?:-[a-z0-9]+)*" required: - definition - groupSlug - kind - position - slug CreateResultMarkRequest: type: object properties: kind: type: string enum: - INCORRECT - ACCEPTED reason: type: string required: - kind - reason CreateReviewBatchRequest: type: object properties: budgetUsd: type: - string - "null" from: type: - string - "null" format: date-time itemKind: type: string to: type: - string - "null" format: date-time required: - budgetUsd - from - itemKind - to CreateReviewRequest: type: object properties: itemId: type: string pattern: "^[1-9][0-9]*$" required: - itemId CreateSurvey: type: object properties: description: type: string maxLength: 500 minLength: 0 endsAt: type: string format: date-time purpose: type: string enum: - PRODUCT - RESEARCH questions: type: array items: $ref: "#/components/schemas/Question" maxItems: 20 minItems: 0 startsAt: type: string format: date-time title: type: string maxLength: 160 minLength: 0 workspaceId: type: integer format: int64 required: - description - purpose - questions - startsAt - title CreateWorkspaceLlmConnectionRequest: type: object description: Connect your own AI provider properties: apiKey: type: string description: API key (write-only; never returned) apiProtocol: type: string description: Wire protocol enum: - openai-completions - openai-responses - openai-decisions - openai-embeddings - cohere-rerank example: openai-responses authMode: type: string description: Credential shape (default BEARER) enum: - BEARER - API_KEY baseUrl: type: string description: Provider base URL maxLength: 2048 minLength: 0 connectionPlatform: type: string description: Admin-declared connection platform; null when not declared enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the connection is active (default false) slug: type: string description: Optional internal slug; generated from displayName when omitted maxLength: 63 minLength: 0 required: - apiProtocol - baseUrl - displayName CreateWorkspaceLlmModelRequest: type: object description: Create a model on your AI provider properties: brand: type: string description: Model brand declared by an admin; display only enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT contextWindow: type: integer format: int32 description: Context window in tokens minimum: 1 dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" maxLength: 200 minLength: 0 displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the model is active (default false) maxOutputTokens: type: integer format: int32 description: Maximum output tokens minimum: 1 operatedBy: type: string description: Who operates the systems the work is sent to; omit to leave the model undeclared enum: - OWN_ORGANISATION - PROVIDER per1mCacheReadUsd: type: number format: decimal description: "Cache-read rate per 1M tokens (USD), if applicable" per1mCacheWriteUsd: type: number format: decimal description: "Cache-write rate per 1M tokens (USD), if applicable" per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD); required when the model has a price per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD); required when the model has a price priceNote: type: string description: "Note; required when the model is free (e.g. self-hosted, no\ \ cost)" maxLength: 500 minLength: 0 pricingMode: type: string description: Pricing mode (default UNPRICED) enum: - PRICED - NO_CHARGE - UNPRICED reasoningEffort: type: string description: "Reasoning effort to request; null sends none, so the provider's\ \ own default applies" enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX slug: type: string description: Optional internal slug; generated from displayName when omitted maxLength: 63 minLength: 0 upstreamModelId: type: string description: Upstream provider model id maxLength: 256 minLength: 0 required: - displayName - upstreamModelId CreateWorkspaceRequest: type: object description: Request to create a new workspace properties: accountLogin: type: string description: Git provider account login (GitHub org/user or GitLab group path) example: my-org maxLength: 255 minLength: 0 accountType: type: string description: Type of account (USER or ORG) enum: - ORG - USER displayName: type: string description: Human-readable name of the workspace example: My Workspace maxLength: 120 minLength: 0 kind: type: string description: "Integration kind to provision. SLACK flows through OAuth,\ \ not this endpoint." enum: - GITHUB - GITLAB example: GITLAB ownerUserId: type: integer format: int64 deprecated: true description: "Deprecated: ignored by the server. The authenticated user\ \ always becomes the owner." personalAccessToken: type: string description: Personal Access Token. Required for both kinds (GitLab API or GitHub PAT). Stored encrypted at rest. example: glpat-... maxLength: 512 minLength: 0 serverUrl: type: string description: "For GitLab, the default GitLab instance this server reads\ \ from, which is also used when omitted; any other instance is refused." example: https://gitlab.example.com workspaceSlug: type: string description: Non-reserved lowercase ASCII DNS label. Consecutive hyphens are prohibited. example: my-workspace maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" required: - accountLogin - accountType - displayName - kind - workspaceSlug CsrfToken: type: object properties: headerName: type: string token: type: string required: - headerName - token CurrentUserView: type: object properties: accessTokenExpiresAt: type: integer format: int64 appRole: type: string avatarUrl: type: string displayName: type: string gitProviderId: type: string id: type: integer format: int64 identityProvider: type: string linkedProviders: type: array items: $ref: "#/components/schemas/LinkedProvider" primaryEmail: type: string profileUrl: type: string roles: type: array items: type: string status: type: string username: type: string Delivered: type: object properties: basedOn: type: array items: $ref: "#/components/schemas/PrivateFeedbackHistoryBasis" body: type: - string - "null" bodyRole: type: - string - "null" enum: - PRACTICE_PAGE_CARD - CONVERSATION_WORDS - MENTOR_NOTES - null deliveredAt: type: string format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION id: type: string format: uuid recordedClaimCurrentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE withdrawn: type: boolean required: - basedOn - body - bodyRole - deliveredAt - destination - id - recordedClaimCurrentness - withdrawn DeliveredFeedbackPractice: type: object properties: name: type: string slug: type: string required: - name - slug DeliveredWorkFeedback: type: object properties: feedback: type: array items: $ref: "#/components/schemas/DeliveredWorkFeedbackItem" item: anyOf: - $ref: "#/components/schemas/ItemRef" - type: "null" required: - feedback - item DeliveredWorkFeedbackCopy: type: object properties: endLine: type: - "null" - integer format: int32 externalRef: type: - string - "null" externalUrl: type: - string - "null" id: type: string format: uuid kind: type: string enum: - SUMMARY - LINE_NOTE - FILE_NOTE - CHAT_TURN path: type: - string - "null" postedAt: type: string format: date-time side: type: - string - "null" enum: - OLD - NEW - null startLine: type: - "null" - integer format: int32 required: - endLine - externalRef - externalUrl - id - kind - path - postedAt - side - startLine DeliveredWorkFeedbackItem: type: object properties: copies: type: array items: $ref: "#/components/schemas/DeliveredWorkFeedbackCopy" deliveredAt: type: string format: date-time id: type: string format: uuid practices: type: array items: $ref: "#/components/schemas/DeliveredFeedbackPractice" required: - copies - deliveredAt - id - practices DutyBasis: allOf: - $ref: "#/components/schemas/ClaimBasis" - type: object properties: criterionQuote: type: string event: type: integer format: int32 explanation: type: string EmailTestRequest: type: object properties: to: type: string format: email description: the mailbox to send the test email to; blank means the caller's own verified address maxLength: 254 minLength: 0 EmailTestResponse: type: object properties: messageId: type: string description: "the accepted Message-ID, only for SENT;\ \ search for it in the relay's log" outcome: type: string description: what became of the test email; SENT is the only success enum: - SENT - EXPIRED - NOT_CONFIGURED - SILENT_MODE - NO_RECIPIENT - UNSUBSCRIBED - INVALID_ADDRESS - REJECTED - UNAVAILABLE - RATE_LIMITED to: type: string description: "the address it went to, or null when there was\ \ no recipient to resolve" required: - outcome Entry: type: object properties: basedOn: type: array items: $ref: "#/components/schemas/Basis" body: type: - string - "null" bodyUnavailable: type: boolean copies: type: array items: $ref: "#/components/schemas/Copy" currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE deliveredAt: type: string format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION id: type: string format: uuid itemVersion: type: - string - "null" state: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED withdrawn: type: boolean required: - basedOn - body - bodyUnavailable - copies - currentness - deliveredAt - destination - id - itemVersion - state - withdrawn ErasureRequest: type: object properties: externalCopiesRemoved: type: boolean required: - externalCopiesRemoved EvidenceCitation: type: object properties: commit: type: - string - "null" endLine: type: - "null" - integer format: int32 path: type: - string - "null" quote: type: - string - "null" side: type: - string - "null" enum: - OLD - NEW - null sourceKind: type: string sourcePath: type: - string - "null" startLine: type: - "null" - integer format: int32 verification: anyOf: - $ref: "#/components/schemas/CitationProofDTO" - type: "null" required: - commit - endLine - path - quote - side - sourceKind - sourcePath - startLine - verification ExportCreated: type: object description: Acknowledgement returned when a data export is requested. properties: id: type: integer format: int64 status: type: string ExportStatus: type: object description: Status of a requested data export; timestamps are null until the matching transition occurs. properties: completedAt: type: string format: date-time expiresAt: type: string format: date-time id: type: integer format: int64 requestedAt: type: string format: date-time status: type: string ExternalDelivery: type: object properties: locator: type: string workspaceId: type: integer format: int64 required: - locator - workspaceId FeatureFlags: type: object description: Feature flags evaluated for the current user properties: ADMIN: type: boolean description: User has admin privileges GITLAB_WORKSPACE_CREATION: type: boolean description: GitLab workspace creation feature is enabled NOTIFICATION_ACCESS: type: boolean description: User can receive notifications FeedbackAccountRef: type: object description: "Who produced a record, as an administrator sees it; absent once\ \ the account is erased." properties: displayName: type: string email: type: string id: type: integer format: int64 required: - displayName - id FeedbackBasis: type: object properties: ordinal: type: integer format: int32 problemId: type: - string - "null" format: uuid result: $ref: "#/components/schemas/ReviewBoundResult" resultId: type: string format: uuid required: - ordinal - problemId - result - resultId FeedbackCheck: type: object properties: allowed: type: boolean checkedAt: type: string format: date-time facts: $ref: "#/components/schemas/FeedbackCheckFacts" reason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null stage: type: string enum: - COMPOSITION - AUTOMATIC - APPROVED - EGRESS required: - allowed - checkedAt - facts - reason - stage FeedbackCheckFacts: type: object properties: admittedRolloutRevision: type: string approvalCurrent: type: boolean currentVersion: type: boolean deliveryEnabled: type: boolean evaluatedRolloutRevision: type: string evidenceAllowed: type: boolean inScope: type: boolean incorrectBasis: type: boolean modelAllowed: type: boolean writeStarted: type: boolean required: - admittedRolloutRevision - approvalCurrent - currentVersion - deliveryEnabled - evaluatedRolloutRevision - evidenceAllowed - inScope - incorrectBasis - modelAllowed - writeStarted FeedbackCompositionTrace: type: object description: |- Exact support and quiet decisions retained with the immutable preparation receipt. A public piece also retains the publication context of the history read it was composed from; the server sets it, never the composer. properties: copies: type: array items: $ref: "#/components/schemas/CopySupport" primaryResultId: type: string format: uuid publicationContext: type: string replacesId: type: string format: uuid withheld: type: array items: $ref: "#/components/schemas/QuietDecision" FeedbackCopy: type: object properties: body: type: - string - "null" chatMessageId: type: - string - "null" format: uuid endLine: type: - "null" - integer format: int32 externalRef: type: - string - "null" externalUrl: type: - string - "null" id: type: string format: uuid kind: type: string enum: - SUMMARY - LINE_NOTE - FILE_NOTE - CHAT_TURN lastError: type: - string - "null" path: type: - string - "null" position: type: integer format: int32 postedAt: type: - string - "null" format: date-time readback: type: - string - "null" enum: - ABSENT - TRANSIENT - UNKNOWN - null side: type: - string - "null" enum: - OLD - NEW - null startLine: type: - "null" - integer format: int32 state: type: string enum: - PLANNED - WRITE_STARTED - POSTED - FAILED - WITHHELD - RETRACTED stopReason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null writeStartedAt: type: - string - "null" format: date-time required: - body - chatMessageId - endLine - externalRef - externalUrl - id - kind - lastError - path - position - postedAt - readback - side - startLine - state - stopReason - writeStartedAt FeedbackCopyCounts: type: object properties: failed: type: integer format: int32 planned: type: integer format: int32 posted: type: integer format: int32 retracted: type: integer format: int32 withheld: type: integer format: int32 writeStarted: type: integer format: int32 required: - failed - planned - posted - retracted - withheld - writeStarted FeedbackDecision: type: object properties: action: type: string enum: - APPROVE - REJECT - WITHDRAW - RESTORE actor: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" contentDigest: type: - string - "null" decidedAt: type: string format: date-time feedbackId: type: string format: uuid id: type: string format: uuid note: type: - string - "null" reasonCode: type: - string - "null" enum: - INCORRECT - MISSING_CONTEXT - UNHELPFUL - DUPLICATE - INAPPROPRIATE_LOCATION - OTHER - null required: - action - actor - contentDigest - decidedAt - feedbackId - id - note - reasonCode FeedbackDisagreement: type: object properties: comment: type: string destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION feedbackId: type: string format: uuid respondedAt: type: string format: date-time required: - comment - destination - feedbackId - respondedAt FeedbackItem: type: object properties: account: $ref: "#/components/schemas/FeedbackAccountRef" appVersion: type: string createdAt: type: string format: date-time id: type: string format: uuid kind: type: string enum: - IDEA - BUG - FEEDBACK message: type: string pagePath: type: string resolvedAt: type: string format: date-time resolvedBy: $ref: "#/components/schemas/FeedbackAccountRef" userAgent: type: string workspace: $ref: "#/components/schemas/FeedbackWorkspaceRef" required: - createdAt - id - kind - message FeedbackModeAssignment: type: object properties: effective: type: string enum: - "OFF" - APPROVE_FIRST - AUTOMATIC override: type: - string - "null" enum: - "OFF" - APPROVE_FIRST - AUTOMATIC - null source: type: string enum: - PRACTICE - GROUP - WORKSPACE - INSTANCE required: - effective - override - source FeedbackModeRollup: type: object properties: approveFirst: type: integer format: int32 automatic: type: integer format: int32 defaultMode: type: string enum: - "OFF" - APPROVE_FIRST - AUTOMATIC "off": type: integer format: int32 required: - approveFirst - automatic - defaultMode - "off" FeedbackRequest: type: object properties: kind: type: string enum: - IDEA - BUG - FEEDBACK message: type: string maxLength: 5000 minLength: 0 pagePath: type: string maxLength: 500 minLength: 0 pattern: "/(?!/)[^?#\\p{Cc}]*" userAgent: type: string maxLength: 500 minLength: 0 pattern: "[^\\p{Cc}]*" required: - kind - message FeedbackResolutionCounts: type: object properties: addressed: type: integer format: int64 disagree: type: integer format: int64 notApplicable: type: integer format: int64 required: - addressed - disagree - notApplicable FeedbackResponse: type: object properties: comment: type: - string - "null" createdAt: type: - string - "null" format: date-time resolution: type: - string - "null" enum: - ADDRESSED - DISAGREE - NOT_APPLICABLE - null usefulness: type: - string - "null" enum: - HELPFUL - UNHELPFUL - null required: - comment - createdAt - resolution - usefulness FeedbackResponseRequest: type: object description: The complete response to delivered feedback properties: comment: type: string description: Optional explanation; required when resolution is DISAGREE. maxLength: 2000 minLength: 0 resolution: type: string description: What the recipient decided to do with the feedback enum: - ADDRESSED - DISAGREE - NOT_APPLICABLE usefulness: type: string description: How useful the feedback was enum: - HELPFUL - UNHELPFUL FeedbackSend: type: object properties: action: type: string enum: - POST - RETRACT attemptCount: type: integer format: int32 createdAt: type: string format: date-time feedbackId: type: string format: uuid lastError: type: - string - "null" nextAttemptAt: type: string format: date-time state: type: string enum: - PENDING - SENDING - UNCERTAIN - DONE updatedAt: type: string format: date-time required: - action - attemptCount - createdAt - feedbackId - lastError - nextAttemptAt - state - updatedAt FeedbackSourceCount: type: object properties: count: type: integer format: int64 itemKind: type: string required: - count - itemKind FeedbackTriage: type: object properties: resolved: type: boolean required: - resolved FeedbackWorkspaceRef: type: object description: The workspace a record was submitted from; absent for instance-level submissions. properties: displayName: type: string id: type: integer format: int64 slug: type: string required: - displayName - id - slug FirstLoginConsent: type: object properties: noticeVersion: type: string participateInResearch: type: boolean description: "Required when the instance names a research organization,\ \ omitted otherwise" researchOrganization: type: string description: The organization the research question named on screen; omitted when it asked none termsAccepted: type: boolean required: - noticeVersion - termsAccepted FrozenModel: type: object properties: modelId: type: string options: type: object additionalProperties: $ref: "#/components/schemas/JsonNode" providerModelId: type: string providerProtocol: type: string reasoningEffort: type: - string - "null" required: - modelId - options - providerModelId - providerProtocol - reasoningEffort FxRateInfo: type: object description: "Display-only currency conversion for the USD amounts in this response.\ \ Multiply a USD amount by ratePerUsd to get the display-currency estimate;\ \ always label it as an estimate and show rateDate, which is the date the\ \ rate was actually published on (not necessarily today), and attribute it\ \ to source." properties: currencyCode: type: string description: ISO 4217 code of the display currency example: EUR rateDate: type: string format: date description: "The date the underlying reference rate was published. A closed\ \ month always reports a date inside that month, so its converted figure\ \ never changes once the month ends." example: 2026-07-24 ratePerUsd: type: number format: decimal description: "Units of the display currency per 1 USD, at 6 decimal places" example: 0.878966 source: type: string description: "Who published the rate, so a disclosure can name it instead\ \ of saying \"a reference rate\". ECB = the European Central Bank's daily\ \ euro foreign-exchange reference rates." enum: - ECB example: ECB required: - currencyCode - rateDate - ratePerUsd - source GeneratedPathReview: type: object properties: excludedPaths: type: array items: type: string patterns: type: array items: type: string reason: type: - string - "null" withheld: type: boolean required: - excludedPaths - patterns - reason - withheld GitHubProvider: type: object description: GitHub provider configuration properties: appInstallationUrl: type: string description: GitHub App installation URL example: https://github.com/apps/hephaestus/installations/new GitLabGroup: type: object description: GitLab group accessible to the provided PAT properties: avatarUrl: type: string description: Group avatar URL fullPath: type: string description: Full group path including parent groups example: my-org/my-team id: type: integer format: int64 description: GitLab group numeric ID name: type: string description: Group display name visibility: type: string description: "Group visibility: public, internal, or private" webUrl: type: string description: Group web URL required: - fullPath - id - name GitLabPreflightRequest: type: object description: Request to validate a GitLab PAT or list accessible groups before workspace creation properties: groupFullPath: type: string description: "GitLab group full path, used to validate the token against\ \ the group when /api/v4/user refuses it" example: my-org/my-team personalAccessToken: type: string description: GitLab Personal Access Token to validate example: your-gitlab-token minLength: 1 serverUrl: type: string description: "The default GitLab instance this server reads from, which\ \ is also used when omitted; any other instance is refused." example: https://gitlab.example.com required: - personalAccessToken GitLabPreflightResponse: type: object description: Result of GitLab PAT validation properties: error: type: string description: Error message if validation failed userId: type: integer format: int64 description: GitLab user ID or group ID username: type: string description: Username of the token owner (personal tokens) or group name (group tokens) valid: type: boolean description: Whether the token is valid required: - valid GitLabProvider: type: object description: GitLab provider configuration properties: defaultServerUrl: type: string description: Origin of the one GitLab instance workspaces are created on example: https://gitlab.lrz.de GroupDefinition: type: object properties: color: type: - string - "null" description: type: - string - "null" icon: type: - string - "null" name: type: string required: - color - description - icon - name GroupRef: type: object properties: color: type: - string - "null" icon: type: - string - "null" name: type: string slug: type: string required: - color - icon - name - slug History: type: object properties: feedback: type: array items: $ref: "#/components/schemas/Entry" item: $ref: "#/components/schemas/ItemRef" HostCoverage: allOf: - $ref: "#/components/schemas/ResultCoverage" - type: object properties: complete: type: boolean failedReads: type: integer format: int32 omitted: type: array items: $ref: "#/components/schemas/CoverageOmission" reads: type: integer format: int32 receipts: type: array items: $ref: "#/components/schemas/ReadReceipt" truncatedReads: type: integer format: int32 Identity: type: object properties: providerId: type: integer format: int64 exclusiveMinimum: 0 subject: type: string maxLength: 255 minLength: 1 teamId: type: string maxLength: 255 minLength: 1 required: - providerId - subject IdentityProviderView: type: object description: |- One row per sign-in option. providerType drives the SPA's icon choice; baseUrl is the OAuth instance origin (scheme + host[:port]) of the authorization endpoint, so the workspace-creation wizard can match a target instance to its login.

baseUrl is the OAuth origin, not the SCM API origin. It is only meaningful for GitLab rows, where the OAuth origin and the API origin coincide (e.g. https://gitlab.example.com). For a GitHub row it is https://github.com (the OAuth host), NOT https://api.github.com; the sole consumer (the workspace wizard) matches GitLab self-hosted origins and never relies on the GitHub value, so the discrepancy is harmless. Do not treat this as an SCM API base URL. properties: baseUrl: type: string displayName: type: string providerType: type: string registrationId: type: string IdentityView: type: object properties: avatarUrl: type: string displayName: type: string id: type: integer format: int64 lastLoginAt: type: string format: date-time providerType: type: string subject: type: string username: type: string required: - id - providerType - subject InapplicabilityWarrant: type: object properties: consulted: type: array items: type: string prerequisite: type: string ruledOutBy: type: string InitiateConnectionRequest: type: object description: |- Inbound payload for POST /workspaces/{workspaceSlug/connections}.

userInput is intentionally a free-form map so per-kind ConnectionStrategy implementations can dictate their own field schema (e.g. Outline needs server_url; GitHub needs nothing because the install URL is server-configured). properties: kind: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE userInput: type: object additionalProperties: type: string required: - kind InitiateConnectionResponse: type: object description: |- Flat response for POST /workspaces/{workspaceSlug/connections}.

Two outcomes, distinguished by type:

Deliberately a flat record (nullable per-variant fields) rather than a sealed oneOf hierarchy: a discriminated union serialises to OpenAPI oneOf + discriminator, which the webapp's hey-api react-query transformer mishandles. A flat shape round-trips cleanly through code generation, so the webapp consumes the generated client instead of a hand-rolled fetch wrapper. properties: connectionId: type: integer format: int64 type: type: string enum: - REDIRECT - LINKED vendorUrl: type: string format: uri required: - type InstanceLlmSettings: type: object description: Instance-wide LLM governance settings properties: allowWorkspaceConnections: type: boolean description: Whether workspaces may register their own LLM connections allowedEgressHosts: type: string description: Comma/newline-delimited egress host allowlist; blank = allow any public host example: "api.openai.com, llm-gateway.example.com" required: - allowWorkspaceConnections InstanceSettings: type: object properties: etag: type: string silentModeChangedAt: type: string format: date-time silentModeChangedByAccountId: type: integer format: int64 silentModeEngaged: type: boolean silentModeReason: type: string required: - etag - silentModeEngaged IntegrationCatalogEntry: type: object description: Integration kind availability + connection status for this workspace properties: connected: type: boolean description: Whether this workspace has a (non-UNINSTALLED) connection for this kind connectionId: type: integer format: int64 description: "Connection id, if connected" connectionState: type: string description: "Connection state, if connected" enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED credentialsUnreadableSince: type: string format: date-time description: When the stored credential was first found unreadable with the server's keys; absent while it reads displayName: type: string description: Human-readable display name kind: type: string description: Integration kind enum: - GITHUB - GITLAB - SLACK - OUTLINE required: - connected - displayName - kind IntroducedBasis: allOf: - $ref: "#/components/schemas/ClaimBasis" - type: object properties: explanation: type: string head: type: integer format: int32 ItemEvent: type: object properties: decidedAt: type: - string - "null" format: date-time foundBy: type: string enum: - WEBHOOK - SYNC - REQUEST - BACKFILL - SCHEDULE id: type: string format: uuid itemId: type: string pattern: "^[1-9][0-9]*$" itemVersion: type: - string - "null" name: type: string occurredAt: type: string format: date-time reason: type: - string - "null" enum: - GATE_WITHHELD - COOLDOWN_ACTIVE - REQUEST_COOLDOWN_ACTIVE - REQUESTER_QUOTA_EXHAUSTED - CONCURRENT_DUPLICATE - COALESCED - OUT_OF_REVIEW_SCOPE - BOT_AUTHOR - BOT_REVIEWER - STALE_ROLLOUT_REVISION - WORKSPACE_INACTIVE - PRACTICES_DISABLED - NO_ACTIVE_PRACTICE - REVIEW_MODEL_UNBOUND - MEMBER_AI_DECLINED - PERSON_DATA_ERASED - FEEDBACK_MODE_OFF - SUBJECT_UNLINKED - MERGE_ACTOR_UNAVAILABLE - MODEL_UNAVAILABLE - BUDGET_EXHAUSTED - ITEM_NOT_VISIBLE - VERSION_SUPERSEDED - PENDING_DEADLINE_EXCEEDED - ITEM_GONE - LEGACY_REVIEW_UNBOUND - null reviewId: type: - string - "null" format: uuid state: type: string enum: - RECORDED - WAITING - STARTED - WITHHELD - EXPIRED required: - decidedAt - foundBy - id - itemId - itemVersion - name - occurredAt - reason - reviewId - state ItemEventOption: type: object properties: connected: type: boolean label: type: string name: type: string raisedBy: type: array items: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE recommended: type: boolean required: - connected - label - name - raisedBy - recommended ItemFact: type: object properties: name: type: string url: type: - string - "null" value: type: - string - "null" required: - name - url - value ItemFacts: type: object properties: facts: type: array items: $ref: "#/components/schemas/ItemFact" item: $ref: "#/components/schemas/ItemRef" required: - facts - item ItemRef: type: object properties: container: type: - string - "null" id: type: string pattern: "^[1-9][0-9]*$" kind: type: string label: type: string parentId: type: - string - "null" pattern: "^[1-9][0-9]*$" path: type: - string - "null" provider: type: - string - "null" enum: - GITHUB - GITLAB - SLACK - OUTLINE - null removedAt: type: - string - "null" format: date-time title: type: - string - "null" url: type: - string - "null" required: - container - id - kind - label - parentId - path - provider - removedAt - title - url ItemTrace: type: object properties: events: type: array items: $ref: "#/components/schemas/ItemEvent" item: $ref: "#/components/schemas/ItemRef" practices: type: array items: $ref: "#/components/schemas/PracticeTraceEntry" reviews: type: array items: $ref: "#/components/schemas/ReviewRef" required: - events - item - practices - reviews JsonNode: type: object properties: array: type: boolean bigDecimal: type: boolean bigInteger: type: boolean binary: type: boolean boolean: type: boolean container: type: boolean double: type: boolean embeddedValue: type: boolean empty: type: boolean float: type: boolean floatingPointNumber: type: boolean int: type: boolean integralNumber: type: boolean long: type: boolean missingNode: type: boolean nodeType: type: string enum: - ARRAY - BINARY - BOOLEAN - MISSING - "NULL" - NUMBER - OBJECT - POJO - STRING "null": type: boolean number: type: boolean object: type: boolean pojo: type: boolean short: type: boolean string: type: boolean textual: type: boolean deprecated: true valueNode: type: boolean JudgedScanReportItem: allOf: - type: object properties: currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE item: $ref: "#/components/schemas/ItemRef" itemVersion: type: string outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string problemCount: type: integer format: int32 recordedAt: type: string format: date-time resultId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null sourceReviewId: type: string format: uuid status: type: string enum: - JUDGED summary: type: - string - "null" required: - currentness - item - itemVersion - outcome - practiceName - practiceSlug - problemCount - recordedAt - resultId - severity - sourceReviewId - status - summary LabelInfo: type: object description: Information about a label from a repository properties: color: type: string description: "Hex color code of the label (without #)" example: d73a4a id: type: integer format: int64 description: Unique identifier of the label name: type: string description: Name of the label repository: $ref: "#/components/schemas/RepositoryInfo" description: Repository the label belongs to required: - color - id - name LatestRelease: type: object description: |- A published release. schemaMigrations is the flag the release workflow publishes for that one release and is absent when the notes carry none; it says nothing about releases between the running one and this one. properties: notesUrl: type: string publishedAt: type: string format: date-time schemaMigrations: type: boolean version: type: string required: - notesUrl - publishedAt - version LegacyFeedbackItem: type: object properties: itemId: type: string pattern: "^[1-9][0-9]*$" required: - itemId LinkedProvider: type: object description: "A provider instance the current user is linked to: its type +\ \ server-url origin." properties: serverUrl: type: string type: type: string ListedScanReportItem: allOf: - type: object properties: item: $ref: "#/components/schemas/ItemRef" itemVersion: type: string lastResult: anyOf: - $ref: "#/components/schemas/ResultList" - type: "null" practiceName: type: string practiceSlug: type: string reason: type: - string - "null" status: type: string enum: - LISTED required: - item - itemVersion - lastResult - practiceName - practiceSlug - reason - status LlmConnection: type: object description: Instance LLM provider connection (API key redacted) properties: apiKeyLast4: type: string description: "Last four characters of the stored API key, if any" apiProtocol: type: string description: Wire protocol enum: - openai-completions - openai-responses - openai-decisions - openai-embeddings - cohere-rerank example: openai-responses authMode: type: string description: Credential shape enum: - BEARER - API_KEY baseUrl: type: string description: Provider base URL connectionPlatform: type: string description: Admin-declared connection platform enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY createdAt: type: string format: date-time description: Creation timestamp displayName: type: string description: Human-readable name enabled: type: boolean description: Whether the connection is enabled hasApiKey: type: boolean description: Whether an API key is stored id: type: integer format: int64 description: Connection ID purposes: type: array description: "The purposes a model on this connection can serve, from its\ \ protocol" items: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING slug: type: string description: Unique slug example: openai-prod updatedAt: type: string format: date-time description: Last update timestamp required: - apiProtocol - authMode - baseUrl - createdAt - displayName - enabled - hasApiKey - id - purposes - slug LlmModel: type: object description: Instance catalog model properties: brand: type: string description: Model brand declared by an admin; display only enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT connectionDisplayName: type: string description: Owning connection's display name connectionId: type: integer format: int64 description: Owning connection id contextWindow: type: integer format: int32 description: Context window in tokens createdAt: type: string format: date-time description: Creation timestamp currentPrice: $ref: "#/components/schemas/LlmModelPrice" description: Current price; null if none has ever been set dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" dataHandlingTier: type: string description: Data-handling tier derived from the operator; UNDECLARED until it is set enum: - IN_HOUSE - CLOUD - UNDECLARED displayName: type: string description: Human-readable name enabled: type: boolean description: Active toggle grantedWorkspaceIds: type: array description: Workspace ids shared with; only meaningful when visibility is GRANTED items: type: integer format: int64 id: type: integer format: int64 description: Model id maxOutputTokens: type: integer format: int32 description: Maximum output tokens operatedBy: type: string description: Who operates the systems the work is sent to; null until declared enum: - OWN_ORGANISATION - PROVIDER reasoningEffort: type: string description: "Reasoning effort requested of the model; null sends none,\ \ the provider's default applies" enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX slug: type: string description: Unique slug within the connection updatedAt: type: string format: date-time description: Last update timestamp upstreamModelId: type: string description: Upstream provider model id visibility: type: string description: Share with all workspaces (PUBLIC) or only selected ones (GRANTED) enum: - PUBLIC - GRANTED required: - connectionDisplayName - connectionId - createdAt - dataHandlingTier - displayName - enabled - grantedWorkspaceIds - id - slug - upstreamModelId - visibility LlmModelPrice: type: object description: "A model's price, per 1M tokens" properties: currency: type: string description: Currency code effectiveFrom: type: string format: date-time description: When this price took effect effectiveTo: type: string format: date-time description: When this price was superseded; null if still current id: type: integer format: int64 description: Price row id note: type: string description: Note per1mCacheReadUsd: type: number format: decimal description: Cache-read rate per 1M tokens (USD) per1mCacheWriteUsd: type: number format: decimal description: Cache-write rate per 1M tokens (USD) per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD) per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD) pricingMode: type: string description: Pricing mode enum: - PRICED - NO_CHARGE - UNPRICED required: - currency - effectiveFrom - id - pricingMode LlmProbeResult: type: object description: Result of testing an LLM connection's /models endpoint properties: message: type: string description: Human-readable diagnostic when not reachable models: type: array description: Model ids returned by the provider (empty if unreachable) items: type: string reachable: type: boolean description: Whether the provider answered with a successful models listing statusCode: type: integer format: int32 description: "HTTP status returned by the provider, if any" required: - models - reachable LlmUsageByDay: type: object description: Spend for one UTC day properties: day: type: string format: date events: type: integer format: int64 description: "Runs: job attempts and mentor turns. Rows of models for practice\ \ scripts are not runs." instanceTotalCostUsd: type: number format: decimal description: "Confirmed spend on shared (instance) models for this day,\ \ in USD." ownProviderTotalCostUsd: type: number format: decimal description: "Spend on this workspace's own connected provider(s) for this\ \ day, in USD." unpricedEventCount: type: integer format: int64 description: Runs this day with at least one ledger row whose cost is unavailable because a rate is missing or the measurement is unverified. A practice script row counts toward the run of its review. Those rows are excluded from both totals above. required: - day - events - instanceTotalCostUsd - ownProviderTotalCostUsd - unpricedEventCount LlmUsageByJobType: type: object description: Month spend aggregated by job type properties: cacheReadTokens: type: integer format: int64 cacheWriteTokens: type: integer format: int64 events: type: integer format: int64 description: "Runs: job attempts and mentor turns. Rows of models for practice\ \ scripts are not runs." inputTokens: type: integer format: int64 instanceTotalCostUsd: type: number format: decimal description: "Confirmed spend on shared (instance) models for this job type,\ \ in USD." jobType: type: string outputTokens: type: integer format: int64 ownProviderTotalCostUsd: type: number format: decimal description: "Spend on this workspace's own connected provider(s) for this\ \ job type, in USD." totalCalls: type: integer format: int64 description: "LLM API calls, as reported by the runtime. Practice reviews\ \ and mentor turns both include every assistant call in an internal tool\ \ loop." unpricedEventCount: type: integer format: int64 description: Runs of this job type with at least one ledger row whose cost is unavailable because a rate is missing or the measurement is unverified. A practice script row counts toward the run of its review. Those rows are excluded from both totals above. required: - cacheReadTokens - cacheWriteTokens - events - inputTokens - instanceTotalCostUsd - jobType - outputTokens - ownProviderTotalCostUsd - totalCalls - unpricedEventCount LlmUsageByPractice: type: object description: "The decision, embedding and reranking calls that one practice's\ \ script made in finished reviews this month. The cost of each review's calls\ \ is split between its practices by the priced tokens that each used." properties: calls: type: integer format: int64 inputTokens: type: integer format: int64 instanceTotalCostUsd: type: number format: decimal description: "This practice's share of the spend on shared (instance) models,\ \ in USD." outputTokens: type: integer format: int64 ownProviderTotalCostUsd: type: number format: decimal description: "This practice's share of the spend on this workspace's own\ \ provider(s), in USD." practiceName: type: string description: The practice name. Null when the slug names no current practice. practiceSlug: type: string description: "The practice slug. Null for calls that cannot be split by\ \ practice any more, such as those of a deleted review." purposes: type: array description: The models for practice scripts that the script called. items: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING reviews: type: integer format: int64 description: Reviews in which the script called a model for practice scripts. A review with several practices counts for each of them. unpricedEventCount: type: integer format: int64 description: "Reviews with a practice script ledger row whose price is not\ \ yet known and that holds this practice's calls, each review counted\ \ once. Those rows are excluded from both totals above. A review with\ \ several practices counts for each of them." required: - calls - inputTokens - instanceTotalCostUsd - outputTokens - ownProviderTotalCostUsd - purposes - reviews - unpricedEventCount LlmUsagePracticeScriptTotal: type: object description: "The decision, embedding and reranking calls of finished reviews\ \ this month, in total. calls, inputTokens, outputTokens and both costs equal\ \ the sums of the byPractice entries. reviews and unpricedEventCount do not:\ \ one review can count for several practices there." properties: calls: type: integer format: int64 inputTokens: type: integer format: int64 instanceTotalCostUsd: type: number format: decimal description: "Confirmed practice script spend on shared (instance) models,\ \ in USD." outputTokens: type: integer format: int64 ownProviderTotalCostUsd: type: number format: decimal description: "Practice script spend on this workspace's own provider(s),\ \ in USD." reviews: type: integer format: int64 description: Distinct reviews in which a practice script called a model for practice scripts. unpricedEventCount: type: integer format: int64 description: Distinct reviews with a practice script ledger row whose price is not yet known. Those rows are excluded from both totals above. required: - calls - inputTokens - instanceTotalCostUsd - outputTokens - ownProviderTotalCostUsd - reviews - unpricedEventCount LoginProviderView: type: object description: Admin view of a login provider. The client secret is never included. properties: baseUrl: type: string createdAt: type: string format: date-time displayName: type: string enabled: type: boolean redirectUri: type: string description: Redirect/callback URI to register on the upstream OAuth app registrationId: type: string scopes: type: string seededFromEnv: type: boolean type: type: string updatedAt: type: string format: date-time required: - baseUrl - createdAt - displayName - redirectUri - registrationId - scopes - type - updatedAt MovePracticeRequest: type: object properties: groupSlug: type: - string - "null" position: type: integer format: int32 minimum: 0 required: - groupSlug - position NotReviewedScanReportItem: allOf: - type: object properties: item: $ref: "#/components/schemas/ItemRef" itemVersion: type: string lastResult: anyOf: - $ref: "#/components/schemas/ResultList" - type: "null" practiceName: type: string practiceSlug: type: string reason: type: - string - "null" status: type: string enum: - NOT_REVIEWED required: - item - itemVersion - lastResult - practiceName - practiceSlug - reason - status Note: type: object properties: body: type: string citationIndex: type: integer format: int32 problemId: type: string format: uuid required: - citationIndex NotificationPreferences: type: object properties: deliveryConfigured: type: boolean description: This instance has an email transport and sender configured emailAvailable: type: boolean description: The account has an active verified email address etag: type: string productFeedback: type: boolean productSurveys: type: boolean researchSurveys: type: boolean surveySummaries: type: boolean workspaceAlerts: type: boolean required: - deliveryConfigured - emailAvailable - etag - productFeedback - productSurveys - researchSurveys - surveySummaries - workspaceAlerts OpenQuestion: type: object properties: citation: anyOf: - $ref: "#/components/schemas/EvidenceCitation" - type: "null" openQuestion: type: string wouldSettleIt: type: string required: - citation - openQuestion - wouldSettleIt OpenWork: type: object description: What is open for one member right now properties: issues: $ref: "#/components/schemas/WorkItemList" description: Open issues assigned to this member pullRequests: $ref: "#/components/schemas/WorkItemList" description: "Open pull requests this member authored, drafts included" reviewRequests: $ref: "#/components/schemas/WorkItemList" description: Open pull requests by other people that ask this member for a review; drafts are excluded teamReviewRequests: $ref: "#/components/schemas/WorkItemList" description: "Open pull requests by other people that ask one of this member's\ \ teams for a review, and not this member: not asking them directly, and\ \ not yet approved or sent back by them. Drafts are excluded. GitHub only;\ \ GitLab has no team reviewers, so a GitLab workspace lists none." required: - issues - pullRequests - reviewRequests - teamReviewRequests OptionCount: type: object properties: count: type: integer format: int64 value: type: string required: - count - value OutcomeVector: type: object properties: couldNotDetermine: type: integer format: int32 doesNotApply: type: integer format: int32 met: type: integer format: int32 notMet: type: integer format: int32 required: - couldNotDetermine - doesNotApply - met - notMet OutlineCollection: type: object description: A mirrored Outline collection with its sync state and live document count properties: collectionId: type: string description: Outline collection id (UUID; the natural key) color: type: - string - "null" description: Collection color as configured in Outline createdAt: type: string format: date-time description: When the collection was registered for mirroring description: type: - string - "null" description: Collection description as shown in Outline documentCount: type: integer format: int64 description: Live (non-tombstoned) mirrored document count documentsUpstream: type: - "null" - integer format: int32 description: Documents upstream reported for this collection at the last enumeration (coverage denominator) exportsSkippedForBudget: type: - "null" - integer format: int32 description: Exports the last pass skipped because the shared budget ran out (0 on a clean pass) icon: type: - string - "null" description: Collection icon as configured in Outline id: type: string description: Internal registry row id pattern: "^[1-9][0-9]*$" lastSyncError: type: - string - "null" description: "Last sync failure for this collection, cleared on the next\ \ clean pass" lastSyncedAt: type: - string - "null" format: date-time description: "When this collection last completed a full reconcile pass,\ \ if any" name: type: - string - "null" description: "Collection name as shown in Outline, if known" state: type: string description: Mirror lifecycle state (PAUSED freezes sync but keeps documents) enum: - ENABLED - PAUSED syncStatus: type: string description: Whether a clean full pass has completed since registration or the last resume enum: - PENDING - COMPLETE urlId: type: - string - "null" description: Outline url id (the short slug in collection URLs) required: - collectionId - color - createdAt - description - documentCount - documentsUpstream - exportsSkippedForBudget - icon - id - lastSyncError - lastSyncedAt - name - state - syncStatus - urlId OutlineCollectionCandidate: type: object description: "An Outline collection the token can see, offered in the add-collection\ \ picker" properties: alreadyMirrored: type: boolean description: Whether this collection is already registered for mirroring collectionId: type: string description: Outline collection id (UUID) color: type: string description: Collection color as configured in Outline description: type: string description: Collection description as shown in Outline icon: type: string description: Collection icon as configured in Outline name: type: string description: Collection name as shown in Outline urlId: type: string description: Outline url id (the short slug in collection URLs) required: - alreadyMirrored - collectionId OutlineTokenStatus: type: object description: Live state of the API token behind the workspace's Outline connection properties: accepted: type: boolean description: "Whether Outline still accepts the stored token. False means\ \ revoked, expired or rejected." expiresAt: type: string format: date-time description: When the token lapses. Absent for a key created without an expiry. last4: type: string description: "Last four characters of the token, as Outline reports them" lastActiveAt: type: string format: date-time description: When Outline last saw the token used name: type: string description: "The token's name in Outline. Absent when the token cannot\ \ list its own key (a scoped key, or one owned by a user who cannot see\ \ it) — sync is unaffected." required: - accepted OverviewWindow: type: object properties: since: type: string format: date-time until: type: string format: date-time required: - since - until OwnFeedbackCopyRef: type: object properties: externalUrl: type: - string - "null" id: type: string format: uuid kind: type: string enum: - SUMMARY - LINE_NOTE - FILE_NOTE - CHAT_TURN postedAt: type: string format: date-time required: - externalUrl - id - kind - postedAt OwnFeedbackRef: type: object properties: copies: type: array items: $ref: "#/components/schemas/OwnFeedbackCopyRef" deliveredAt: type: - string - "null" format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION id: type: string format: uuid response: anyOf: - $ref: "#/components/schemas/FeedbackResponse" - type: "null" state: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED required: - copies - deliveredAt - destination - id - response - state OwnItemEvent: type: object properties: name: type: string occurredAt: type: string format: date-time required: - name - occurredAt OwnItemTrace: type: object properties: events: type: array items: $ref: "#/components/schemas/OwnItemEvent" item: $ref: "#/components/schemas/ItemRef" results: type: array items: $ref: "#/components/schemas/ResultList" review: $ref: "#/components/schemas/ReviewRef" required: - events - item - results - review Page: type: object properties: body: type: string nextStep: type: string title: type: string PageMetadata: properties: number: type: integer format: int64 size: type: integer format: int64 totalElements: type: integer format: int64 totalPages: type: integer format: int64 required: - number - size - totalElements - totalPages PageResponseDTOAuthEventView: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/AuthEventView" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOConfigAuditEntryView: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ConfigAuditEntryView" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOItemEvent: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ItemEvent" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOItemRef: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ItemRef" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOProfileReview: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ProfileReview" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOResultList: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ResultList" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOReviewBatch: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ReviewBatch" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOReviewFeedback: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ReviewFeedback" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOReviewProblem: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ReviewProblem" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOReviewResult: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ReviewResult" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOReviewSummary: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ReviewSummary" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOScanSummary: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/ScanSummary" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOSyncJob: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/SyncJob" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOUserViewAccount: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/UserViewAccount" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages PageResponseDTOWorkspaceMembership: type: object description: |- Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl is an implementation detail, not a JSON contract; these fields preserve the existing clients' response shape without relying on its bean properties. New APIs use Spring Data's PagedModel. properties: content: type: array items: $ref: "#/components/schemas/WorkspaceMembership" empty: type: boolean first: type: boolean last: type: boolean number: type: integer format: int32 numberOfElements: type: integer format: int32 pageable: $ref: "#/components/schemas/Pageable" size: type: integer format: int32 sort: $ref: "#/components/schemas/Sort" totalElements: type: integer format: int64 totalPages: type: integer format: int32 required: - content - empty - first - last - number - numberOfElements - pageable - size - sort - totalElements - totalPages Pageable: type: object properties: offset: type: integer format: int64 pageNumber: type: integer format: int32 pageSize: type: integer format: int32 paged: type: boolean sort: $ref: "#/components/schemas/Sort" unpaged: type: boolean required: - offset - pageNumber - pageSize - paged - sort - unpaged PagedModelFeedbackItem: type: object properties: content: type: array items: $ref: "#/components/schemas/FeedbackItem" page: $ref: "#/components/schemas/PageMetadata" PagedModelSurvey: type: object properties: content: type: array items: $ref: "#/components/schemas/Survey" page: $ref: "#/components/schemas/PageMetadata" PagedModelSurveyResponse: type: object properties: content: type: array items: $ref: "#/components/schemas/SurveyResponse" page: $ref: "#/components/schemas/PageMetadata" ParticipationCounts: type: object properties: declined: type: integer format: int64 invited: type: integer format: int64 description: "every account shown the invitation, including those who then\ \ responded or declined" responded: type: integer format: int64 required: - declined - invited - responded PersonDataProvider: type: object properties: id: type: integer format: int64 serverUrl: type: string type: type: string required: - id - serverUrl - type PersonDataRequest: type: object properties: completed: type: object additionalProperties: type: integer format: int64 counts: type: object additionalProperties: type: integer format: int64 expiresAt: type: string format: date-time externalDeliveries: type: array items: $ref: "#/components/schemas/ExternalDelivery" failureCode: type: string id: type: string format: uuid scope: $ref: "#/components/schemas/PersonDataScope" state: type: string enum: - PREVIEW - ERASING - FAILED - COMPLETE - EXPIRED required: - completed - counts - expiresAt - externalDeliveries - id - state PersonDataScope: type: object properties: accountId: type: integer format: int64 identities: type: array items: $ref: "#/components/schemas/Identity" required: - identities Practice: type: object properties: catalogOrigin: $ref: "#/components/schemas/CatalogOrigin" createdAt: type: string format: date-time currentVersion: $ref: "#/components/schemas/PracticeVersion" feedbackMode: $ref: "#/components/schemas/FeedbackModeAssignment" groupSlug: type: - string - "null" id: type: string pattern: "^[1-9][0-9]*$" kind: type: string position: type: integer format: int32 slug: type: string updatedAt: type: - string - "null" format: date-time required: - catalogOrigin - createdAt - currentVersion - feedbackMode - groupSlug - id - kind - position - slug - updatedAt PracticeDefinition: type: object additionalProperties: false properties: about: type: - string - "null" enum: - AUTHOR - REVIEWER - ASSIGNEE - MERGER - null appliesWhen: anyOf: - $ref: "#/components/schemas/AppliesWhen" - type: "null" criteria: type: string guidance: $ref: "#/components/schemas/PracticeGuidance" lineNotes: type: boolean name: type: string reads: $ref: "#/components/schemas/PracticeReads" reviewOn: $ref: "#/components/schemas/ReviewOn" reviewedBy: $ref: "#/components/schemas/ReviewedBy" scan: anyOf: - $ref: "#/components/schemas/ScanDefinition" - type: "null" script: type: - string - "null" required: - about - appliesWhen - criteria - guidance - lineNotes - name - reads - reviewOn - reviewedBy - scan - script PracticeDefinitionInput: type: object additionalProperties: false properties: about: type: - string - "null" enum: - AUTHOR - REVIEWER - ASSIGNEE - MERGER - null appliesWhen: anyOf: - $ref: "#/components/schemas/AppliesWhen" - type: "null" criteria: type: string minLength: 1 guidance: $ref: "#/components/schemas/PracticeGuidance" lineNotes: type: boolean name: type: string minLength: 1 reads: $ref: "#/components/schemas/PracticeReads" reviewOn: $ref: "#/components/schemas/ReviewOn" reviewedBy: $ref: "#/components/schemas/ReviewedByInput" scan: anyOf: - $ref: "#/components/schemas/ScanDefinition" - type: "null" script: type: - string - "null" required: - about - appliesWhen - criteria - guidance - lineNotes - name - reads - reviewOn - reviewedBy - scan - script PracticeDefinitionOptions: type: object properties: itemTypes: type: array items: $ref: "#/components/schemas/PracticeItemTypeOption" sourceContract: type: string required: - itemTypes - sourceContract PracticeGroup: type: object properties: catalogOrigin: $ref: "#/components/schemas/CatalogOrigin" color: type: - string - "null" createdAt: type: string format: date-time description: type: - string - "null" feedbackMode: $ref: "#/components/schemas/FeedbackModeAssignment" icon: type: - string - "null" id: type: string pattern: "^[1-9][0-9]*$" name: type: string position: type: integer format: int32 shownToDevelopers: type: boolean slug: type: string updatedAt: type: - string - "null" format: date-time required: - catalogOrigin - color - createdAt - description - feedbackMode - icon - id - name - position - shownToDevelopers - slug - updatedAt PracticeGroupStanding: type: object properties: direction: type: - string - "null" enum: - IMPROVING - DECLINING - UNCERTAIN - INSUFFICIENT_EVIDENCE - null feedbackSince: type: - string - "null" format: date-time feedbackSpanDays: type: - "null" - integer format: int32 groupColor: type: - string - "null" groupDescription: type: - string - "null" groupIcon: type: - string - "null" groupName: type: string groupSlug: type: string guidance: type: - string - "null" guidanceSource: type: - string - "null" enum: - RULE_BASED - null results: type: array items: $ref: "#/components/schemas/PracticeStandingResult" sources: type: array items: $ref: "#/components/schemas/FeedbackSourceCount" standing: type: string enum: - DEVELOPING - STRENGTH - MIXED - NOT_OBSERVED - NO_OPPORTUNITY trendSupport: anyOf: - $ref: "#/components/schemas/TrendSupport" - type: "null" required: - direction - feedbackSince - feedbackSpanDays - groupColor - groupDescription - groupIcon - groupName - groupSlug - guidance - guidanceSource - results - sources - standing - trendSupport PracticeGuidance: type: object properties: goingWell: type: - string - "null" guide: anyOf: - $ref: "#/components/schemas/PracticeGuide" - type: "null" visual: anyOf: - $ref: "#/components/schemas/PracticeVisual" - type: "null" whatGoodLooksLike: type: - string - "null" whyItMatters: type: - string - "null" required: - goingWell - guide - visual - whatGoodLooksLike - whyItMatters PracticeGuidanceDTO: type: object properties: guide: anyOf: - $ref: "#/components/schemas/PracticeGuide" - type: "null" practiceSlug: type: string visual: anyOf: - $ref: "#/components/schemas/PracticeVisual" - type: "null" required: - guide - practiceSlug - visual PracticeGuide: type: object additionalProperties: false description: "Developer guidance: the text of a practice's Guide tab and the\ \ SVG figures it shows. Never changes how the practice is reviewed" properties: figures: type: object additionalProperties: type: string description: "SVG markup of each figure the Markdown shows, by figure name" markdown: type: string description: "Markdown. Shows a figure with ![description](figures/.svg)" maxLength: 12000 required: - figures - markdown PracticeItemTypeOption: type: object properties: aboutRoles: type: array items: type: string enum: - AUTHOR - REVIEWER - ASSIGNEE - MERGER applicabilityClauses: type: array items: type: string enum: - CHANGED_PATH - DIFF_CONTAINS - HAS_ITEMS applicabilitySources: type: array items: $ref: "#/components/schemas/ReadSourceOption" events: type: array items: $ref: "#/components/schemas/ItemEventOption" kind: type: string label: type: string readSources: type: array items: $ref: "#/components/schemas/ReadSourceOption" reviewOnStateDimensions: type: array items: $ref: "#/components/schemas/StateDimension" scanItemKinds: type: array items: type: string scanSupported: type: boolean required: - aboutRoles - applicabilityClauses - applicabilitySources - events - kind - label - readSources - reviewOnStateDimensions - scanItemKinds - scanSupported PracticePageCleanWork: type: object properties: item: $ref: "#/components/schemas/ItemRef" recordedAt: type: string format: date-time resultId: type: string format: uuid reviewId: type: string format: uuid required: - item - recordedAt - resultId - reviewId PracticePageEvidence: type: object properties: item: $ref: "#/components/schemas/ItemRef" recordedAt: type: string format: date-time resultId: type: string format: uuid reviewId: type: string format: uuid summary: type: - string - "null" required: - item - recordedAt - resultId - reviewId - summary PracticePageFeedback: type: object properties: body: type: - string - "null" cleanNeeded: type: integer format: int32 cleanWork: type: array items: $ref: "#/components/schemas/PracticePageCleanWork" closedAt: type: - string - "null" format: date-time closedBy: type: - string - "null" enum: - WORK - DEVELOPER - PRACTICE_CHANGED - null evidence: type: array items: $ref: "#/components/schemas/PracticePageEvidence" groupName: type: - string - "null" groupSlug: type: - string - "null" headline: type: string id: type: string format: uuid nextStep: type: - string - "null" practiceName: type: string practiceSlug: type: string preparedAt: type: string format: date-time readAt: type: - string - "null" format: date-time response: anyOf: - $ref: "#/components/schemas/FeedbackResponse" - type: "null" unverifiedHistory: type: boolean whatGoodLooksLike: type: - string - "null" whyItMatters: type: - string - "null" withdrawn: type: boolean required: - body - cleanNeeded - cleanWork - closedAt - closedBy - evidence - groupName - groupSlug - headline - id - nextStep - practiceName - practiceSlug - preparedAt - readAt - response - unverifiedHistory - whatGoodLooksLike - whyItMatters - withdrawn PracticePageSupport: discriminator: mapping: COMPLETE: "#/components/schemas/CompletePracticePageSupport" REFUSED: "#/components/schemas/ClosedPracticePageSupport" UNAVAILABLE: "#/components/schemas/ClosedPracticePageSupport" propertyName: state oneOf: - $ref: "#/components/schemas/CompletePracticePageSupport" - $ref: "#/components/schemas/ClosedPracticePageSupport" PracticeProfileOverview: type: object properties: changes: type: array items: $ref: "#/components/schemas/ProfileChange" latestReview: anyOf: - $ref: "#/components/schemas/ProfileReviewRef" - type: "null" reviewedItems: type: array items: $ref: "#/components/schemas/ItemRef" window: $ref: "#/components/schemas/OverviewWindow" required: - changes - latestReview - reviewedItems - window PracticeReadSource: type: object properties: need: type: string enum: - REQUIRED - COMPLETE - OPTIONAL source: type: string required: - need - source PracticeReads: type: object properties: contract: type: string sources: type: array items: $ref: "#/components/schemas/PracticeReadSource" required: - contract - sources PracticeReleaseField: type: object properties: changedLocally: type: boolean conflict: type: boolean field: type: string enum: - NAME - REVIEW_ON - APPLIES_WHEN - ABOUT - READS - REVIEWED_BY - CRITERIA - SCRIPT - SCAN - LINE_NOTES - GUIDANCE offeredChanged: type: boolean required: - changedLocally - conflict - field - offeredChanged PracticeReleaseProposal: type: object properties: base: anyOf: - $ref: "#/components/schemas/PracticeDefinition" - type: "null" current: $ref: "#/components/schemas/PracticeDefinition" currentVersionId: type: - string - "null" pattern: "^[1-9][0-9]*$" etag: type: string fields: type: array items: $ref: "#/components/schemas/PracticeReleaseField" offered: $ref: "#/components/schemas/PracticeDefinition" offeredDigest: type: string practiceSlug: type: string required: - base - current - currentVersionId - etag - fields - offered - offeredDigest - practiceSlug PracticeReviewScopePreview: type: object properties: current: $ref: "#/components/schemas/PracticeReviewScopeSummary" description: Effective coverage before the proposed change proposed: $ref: "#/components/schemas/PracticeReviewScopeSummary" description: Effective coverage if the proposed change is applied widens: type: boolean description: "Whether the proposal admits any repository, branch, or person\ \ excluded now" required: - current - proposed - widens PracticeReviewScopeSummary: type: object properties: eligiblePeople: type: integer format: int32 description: Eligible linked human members in the workspace estimateWindowDays: type: integer format: int32 description: Number of days included in recentReviewVolume monitoredRepositories: type: integer format: int32 description: Repositories currently monitored by the workspace recentReviewVolume: type: integer format: int32 description: Workspace-wide practice-review jobs created during the estimate window selectedPeople: type: integer format: int32 description: Eligible linked members admitted by the people coverage axis selectedRepositories: type: integer format: int32 description: Monitored repositories admitted by the repository coverage axis required: - eligiblePeople - estimateWindowDays - monitoredRepositories - recentReviewVolume - selectedPeople - selectedRepositories PracticeReviewSettings: type: object description: "A workspace's practice-review policy: effective values plus raw\ \ overrides" properties: cooldownMinutes: type: integer format: int32 description: "Effective: minimum minutes between reviews for the same PR" cooldownMinutesOverride: type: - "null" - integer format: int32 description: Raw override; null = inheriting the fleet default defaultFeedbackMode: type: string description: The default feedback mode when neither the practice nor its group selects one. enum: - "OFF" - APPROVE_FIRST - AUTOMATIC defaultFeedbackModeOverride: type: - string - "null" description: Raw override; null inherits APPROVE_FIRST enum: - "OFF" - APPROVE_FIRST - AUTOMATIC - null deliverToMerged: type: boolean description: "Effective: deliver feedback to merged PRs/MRs" deliverToMergedOverride: type: - boolean - "null" description: Raw override; null = inheriting the fleet default deliveryStatus: type: string description: Whether new external practice feedback may be sent enum: - ACTIVE - PAUSED etag: type: string description: Strong entity tag to send in If-Match when updating this rollout generatedPaths: type: object additionalProperties: type: array items: type: string description: "Repository-root Ant-style generated-path patterns, keyed by\ \ monitored repository item ID" reviewScope: $ref: "#/components/schemas/WorkspaceReviewScope" description: Explicit all-or-selected repository and person coverage. Selected-empty means nobody. revision: type: string description: Monotonic rollout revision carried by automatically admitted review jobs scopeSummary: $ref: "#/components/schemas/PracticeReviewScopeSummary" required: - cooldownMinutes - cooldownMinutesOverride - defaultFeedbackMode - defaultFeedbackModeOverride - deliverToMerged - deliverToMergedOverride - deliveryStatus - etag - generatedPaths - reviewScope - revision - scopeSummary PracticeScriptAsOf: type: object properties: finishedAt: type: string format: date-time jobId: type: string format: uuid reviewId: type: string format: uuid required: - finishedAt - jobId - reviewId PracticeScriptModel: type: object properties: cacheReadTokens: type: integer format: int64 cacheWriteTokens: type: integer format: int64 calls: type: integer format: int64 dataHandlingTier: type: - string - "null" enum: - IN_HOUSE - CLOUD - UNDECLARED - null inputTokens: type: integer format: int64 kind: type: string enum: - CHAT - DECISION - EMBEDDING - RERANKING modelId: type: - string - "null" outputTokens: type: integer format: int64 required: - cacheReadTokens - cacheWriteTokens - calls - dataHandlingTier - inputTokens - kind - modelId - outputTokens PracticeScriptNeed: type: object properties: need: type: string enum: - required - optional slot: type: string enum: - chat - decision - embedding - reranking unmetTiers: type: array items: type: string enum: - IN_HOUSE - CLOUD - UNDECLARED required: - need - slot - unmetTiers PracticeScriptRun: type: object properties: attempt: type: integer format: int32 durationMs: type: - "null" - integer format: int64 error: type: - string - "null" finishedAt: type: string format: date-time jobId: type: string format: uuid models: type: array items: $ref: "#/components/schemas/PracticeScriptModel" noResultCause: type: - string - "null" description: "Why a run that stopped as OFF_FORMAT has no result, when the\ \ runner's counts or the built-in's contract prove it. Absent otherwise;\ \ then the stop reason stands alone." enum: - EVIDENCE_NOT_READ - SESSION_ENDED - null practiceId: type: string pattern: "^[1-9][0-9]*$" practiceVersionId: type: string pattern: "^[1-9][0-9]*$" reviewModelCalls: type: - "null" - integer format: int32 description: "Model calls of the practice's review sessions, as the runner\ \ counted them. Not the calls the proxy billed: those are counted for\ \ the whole review. Absent when the runner did not record them." scriptKind: type: string enum: - BUILTIN - CUSTOM status: type: string enum: - OK - WITHHELD - FAILED - NOT_REACHED - NOT_FINISHED stopReason: type: - string - "null" enum: - UNAVAILABLE - BUDGET - DEADLINE - TOO_LARGE - OFF_FORMAT - REFUSED - ERROR - CANCELLED - INVALID_SCRIPT - INVALID_CANDIDATE - null required: - attempt - durationMs - error - finishedAt - jobId - models - noResultCause - practiceId - practiceVersionId - reviewModelCalls - scriptKind - status - stopReason PracticeScriptSummary: type: object properties: asOf: anyOf: - $ref: "#/components/schemas/PracticeScriptAsOf" - type: "null" needs: type: array items: $ref: "#/components/schemas/PracticeScriptNeed" practiceName: type: string practiceSlug: type: string scriptChanged: type: boolean required: - asOf - needs - practiceName - practiceSlug - scriptChanged PracticeStanding: type: object properties: direction: type: - string - "null" enum: - IMPROVING - DECLINING - UNCERTAIN - INSUFFICIENT_EVIDENCE - null doesNotApplyOnly: type: boolean groupName: type: - string - "null" groupSlug: type: - string - "null" name: type: string slug: type: string standing: type: string enum: - DEVELOPING - STRENGTH - MIXED - NOT_OBSERVED - NO_OPPORTUNITY strengths: type: array items: $ref: "#/components/schemas/PracticeStandingResult" toWorkOn: type: array items: $ref: "#/components/schemas/PracticeStandingResult" trendSupport: anyOf: - $ref: "#/components/schemas/TrendSupport" - type: "null" whatGoodLooksLike: type: - string - "null" whyItMatters: type: - string - "null" required: - direction - doesNotApplyOnly - groupName - groupSlug - name - slug - standing - strengths - toWorkOn - trendSupport - whatGoodLooksLike - whyItMatters PracticeStandingResult: type: object properties: deliveredFeedback: type: - string - "null" item: $ref: "#/components/schemas/ItemRef" origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE resultId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null title: type: string required: - deliveredFeedback - item - origin - outcome - resultId - severity - title PracticeSupport: type: object properties: decision: type: string enum: - ADMIT - FEEDBACK_OFF - GATE_REFUSED - NO_EVIDENCE - UNCORROBORATED - BACKFILL_HELD - RECENTLY_SURFACED - UNATTRIBUTABLE_SUBJECT occurrences: type: array items: $ref: "#/components/schemas/SupportOccurrence" practiceSlug: type: string stopReason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null required: - decision - occurrences - practiceSlug - stopReason PracticeTraceEntry: type: object properties: about: type: - string - "null" enum: - AUTHOR - REVIEWER - ASSIGNEE - MERGER - null feedbackMode: type: string enum: - "OFF" - APPROVE_FIRST - AUTOMATIC practiceSlug: type: string results: $ref: "#/components/schemas/ReviewResultCounts" review: anyOf: - $ref: "#/components/schemas/ReviewRef" - type: "null" reviewOn: $ref: "#/components/schemas/ReviewOn" withheldReasons: type: array items: $ref: "#/components/schemas/ReasonCount" required: - about - feedbackMode - practiceSlug - results - review - reviewOn - withheldReasons PracticeVersion: type: object properties: changed: type: array items: type: string enum: - NAME - REVIEW_ON - APPLIES_WHEN - ABOUT - READS - REVIEWED_BY - CRITERIA - SCRIPT - SCAN - LINE_NOTES - GUIDANCE createdAt: type: string format: date-time createdBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" definition: anyOf: - $ref: "#/components/schemas/PracticeDefinition" - type: "null" id: type: string pattern: "^[1-9][0-9]*$" name: type: - string - "null" number: type: integer format: int32 reviewChanged: type: boolean reviewDigest: type: string required: - changed - createdAt - createdBy - definition - id - name - number - reviewChanged - reviewDigest PracticeVisual: type: object additionalProperties: false description: "Developer guidance: one picture of the practice and what it shows.\ \ Never changes how the practice is reviewed" properties: alt: type: string description: "What the picture shows, for people who cannot see it" maxLength: 300 svg: type: string description: SVG markup. Shapes and text only; colors come from the pv-* theme classes required: - alt - svg PracticeWorkspaceOverview: type: object properties: developers: type: integer format: int32 practices: type: array items: $ref: "#/components/schemas/PracticeWorkspaceTile" required: - developers - practices PracticeWorkspaceTile: type: object properties: developers: type: integer format: int32 group: anyOf: - $ref: "#/components/schemas/GroupRef" - type: "null" outcomes: $ref: "#/components/schemas/OutcomeVector" practiceName: type: string practiceSlug: type: string required: - developers - group - outcomes - practiceName - practiceSlug PrepareFeedbackRequest: type: object properties: attempt: type: integer format: int32 basisResultIds: type: array items: type: string format: uuid composition: type: array items: $ref: "#/components/schemas/ComposedFeedback" jobId: type: string format: uuid publicComposition: type: boolean publicationContext: type: - string - "null" reviewId: type: string format: uuid required: - attempt - basisResultIds - composition - jobId - publicComposition - publicationContext - reviewId PrepareFeedbackResponse: type: object properties: contentDigest: type: string feedbackIds: type: array items: type: string format: uuid preparedAt: type: string format: date-time required: - contentDigest - feedbackIds - preparedAt PreviewRequest: type: object properties: accountId: type: integer format: int64 exclusiveMinimum: 0 identities: type: array items: $ref: "#/components/schemas/Identity" maxItems: 32 minItems: 0 required: - identities PrivateFeedbackHistory: type: object description: |- The private feedback this developer received, and conversation feedback still queued for them, on each private destination this composition may write for its practice. It is one bounded read, never the complete history: coverage says what it leaves out. A body is present where its words may be copied. It records what was said. recordedClaimCurrentness says separately whether the claim behind it still holds. properties: coverage: $ref: "#/components/schemas/Coverage" delivered: type: array items: $ref: "#/components/schemas/Delivered" queued: type: array items: $ref: "#/components/schemas/Queued" readAt: type: string format: date-time required: - coverage - delivered - queued - readAt PrivateFeedbackHistoryBasis: type: object properties: outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceSlug: type: string practiceVersionId: type: - "null" - integer format: int64 resultId: type: string format: uuid required: - outcome - practiceSlug - practiceVersionId - resultId ProbeLlmConnectionRequest: type: object description: Draft connection probe using a supplied (never-persisted) credential properties: apiKey: type: string description: API key used only for this probe apiProtocol: type: string description: Wire protocol enum: - openai-completions - openai-responses - openai-decisions - openai-embeddings - cohere-rerank authMode: type: string description: Credential shape (default BEARER) enum: - BEARER - API_KEY baseUrl: type: string description: Provider base URL minLength: 1 required: - apiProtocol - baseUrl Problem: type: object properties: basis: anyOf: - oneOf: - $ref: "#/components/schemas/DutyBasis" - $ref: "#/components/schemas/IntroducedBasis" - $ref: "#/components/schemas/StateBasis" - $ref: "#/components/schemas/WorsenedBasis" - type: "null" citations: type: array items: $ref: "#/components/schemas/EvidenceCitation" explanation: type: - string - "null" id: type: string format: uuid key: type: - string - "null" nextStep: type: - string - "null" position: type: integer format: int32 resultId: type: string format: uuid severity: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL summary: type: string required: - basis - citations - explanation - id - key - nextStep - position - resultId - severity - summary ProblemChanges: type: object properties: absent: type: integer format: int32 new: type: integer format: int32 unchanged: type: integer format: int32 updated: type: integer format: int32 required: - absent - unchanged - updated ProblemDetail: type: object properties: detail: type: string instance: type: string format: uri properties: type: object additionalProperties: {} status: type: integer format: int32 title: type: string type: type: string format: uri ProblemSummary: type: object properties: id: type: string format: uuid severity: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL summary: type: string required: - id - severity - summary ProfileChange: type: object properties: at: type: string format: date-time cleanNeeded: type: - "null" - integer format: int32 direction: type: - string - "null" enum: - UP - DOWN - null evidence: type: array items: $ref: "#/components/schemas/ItemRef" feedbackId: type: - string - "null" format: uuid from: type: - string - "null" groupName: type: - string - "null" groupSlug: type: - string - "null" practiceName: type: - string - "null" practiceSlug: type: - string - "null" resolvedBy: type: - string - "null" enum: - WORK - DEVELOPER - null to: type: - string - "null" type: type: string enum: - FEEDBACK_NEW - FEEDBACK_RESOLVED - FEEDBACK_RESET - STANDING_MOVED - TREND_TURNED - GROUP_MOVED - FIRST_RECORDED required: - at - cleanNeeded - direction - evidence - feedbackId - from - groupName - groupSlug - practiceName - practiceSlug - resolvedBy - to - type ProfileReview: type: object properties: feedback: type: array items: $ref: "#/components/schemas/OwnFeedbackRef" results: type: array items: $ref: "#/components/schemas/ResultList" review: $ref: "#/components/schemas/ReviewRef" required: - feedback - results - review ProfileReviewDetail: type: object properties: feedback: type: array items: $ref: "#/components/schemas/OwnFeedbackRef" practiceOutcomes: $ref: "#/components/schemas/OutcomeVector" results: type: array items: $ref: "#/components/schemas/ResultList" review: $ref: "#/components/schemas/ReviewRef" trace: $ref: "#/components/schemas/OwnItemTrace" required: - feedback - practiceOutcomes - results - review - trace ProfileReviewRef: type: object properties: at: type: string format: date-time item: $ref: "#/components/schemas/ItemRef" reviewId: type: string format: uuid status: type: - string - "null" enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED - null required: - at - item - reviewId - status ProjectedCitation: type: object properties: anchorable: type: boolean commit: type: - string - "null" endLine: type: - "null" - integer format: int32 index: type: integer format: int32 path: type: - string - "null" quote: type: - string - "null" side: type: - string - "null" enum: - OLD - NEW - null sourceKind: type: string sourcePath: type: - string - "null" startLine: type: - "null" - integer format: int32 verification: anyOf: - $ref: "#/components/schemas/CitationProof" - type: "null" required: - anchorable - commit - endLine - index - path - quote - side - sourceKind - sourcePath - startLine - verification ProviderIdentityRef: type: object properties: avatarUrl: type: - string - "null" displayName: type: - string - "null" login: type: - string - "null" provider: type: string enum: - GITHUB - GITLAB - SLACK - OUTLINE required: - avatarUrl - displayName - login - provider PublicActivity: type: object description: "The public contract excludes account details, teams, automation\ \ and private activity." properties: allowSearchEngines: type: boolean coverage: $ref: "#/components/schemas/ActivityCoverage" from: type: string format: date-time highlights: $ref: "#/components/schemas/PublicActivityHighlights" people: type: array items: $ref: "#/components/schemas/PublicActivityPerson" providerType: type: string description: The source-control provider the repositories and people belong to enum: - GITHUB - GITLAB - SLACK - OUTLINE repositories: type: array items: $ref: "#/components/schemas/PublicActivityRepository" to: type: string format: date-time workspaceName: type: string required: - allowSearchEngines - coverage - from - highlights - people - repositories - to - workspaceName PublicActivityChoice: type: object properties: visible: type: boolean required: - visible PublicActivityCounts: type: object properties: activeWeeks: type: integer format: int64 contributions: type: integer format: int64 issuesOpened: type: integer format: int64 peopleHelped: type: integer format: int64 pullRequestsMerged: type: integer format: int64 pullRequestsOpened: type: integer format: int64 pullRequestsReviewed: type: integer format: int64 required: - activeWeeks - contributions - issuesOpened - peopleHelped - pullRequestsMerged - pullRequestsOpened - pullRequestsReviewed PublicActivityHiddenCount: type: object properties: hiddenPeople: type: integer format: int64 required: - hiddenPeople PublicActivityHighlights: type: object properties: firstContributors: type: array items: type: string mostPeopleHelped: type: array items: type: string required: - firstContributors - mostPeopleHelped PublicActivityOnboarding: type: object properties: seen: type: boolean visible: type: boolean required: - seen - visible PublicActivityOnboardingRequest: type: object properties: visible: type: boolean required: - visible PublicActivityPerson: type: object properties: avatarUrl: type: string counts: $ref: "#/components/schemas/PublicActivityCounts" firstContributionAt: type: string format: date-time login: type: string name: type: string profileUrl: type: string weeks: type: array items: $ref: "#/components/schemas/ActivitySparklineWeek" required: - avatarUrl - counts - login - name - profileUrl - weeks PublicActivityPersonDetail: type: object description: "One published person's public contributions. Excludes account\ \ details, teams, automation and private activity." properties: breakdown: $ref: "#/components/schemas/PublicActivityReviewBreakdown" counts: $ref: "#/components/schemas/PublicActivityCounts" firstContributionAt: type: string format: date-time from: type: string format: date-time person: $ref: "#/components/schemas/PublicActivityPersonIdentity" repositories: type: array items: $ref: "#/components/schemas/PublicActivityPersonRepository" supportedKinds: type: array items: type: string enum: - PULL_REQUEST_OPENED - PULL_REQUEST_MERGED - PULL_REQUEST_CLOSED - REVIEW_APPROVED - REVIEW_CHANGES_REQUESTED - REVIEW_COMMENTED - COMMENTED - CODE_COMMENTED - ISSUE_OPENED - ISSUE_CLOSED to: type: string format: date-time weeks: type: array items: $ref: "#/components/schemas/PublicActivityPersonWeek" required: - breakdown - counts - from - person - repositories - supportedKinds - to - weeks PublicActivityPersonIdentity: type: object properties: avatarUrl: type: string htmlUrl: type: string login: type: string name: type: string required: - avatarUrl - htmlUrl - login - name PublicActivityPersonRepository: type: object properties: counts: $ref: "#/components/schemas/PublicActivityCounts" repository: $ref: "#/components/schemas/PublicActivityRepository" rowKey: type: string required: - counts - repository - rowKey PublicActivityPersonWeek: type: object properties: breakdown: $ref: "#/components/schemas/PublicActivityReviewBreakdown" counts: $ref: "#/components/schemas/PublicActivityCounts" start: type: string format: date-time required: - breakdown - counts - start PublicActivityPolicy: type: object properties: allowed: type: boolean required: - allowed PublicActivityRepository: type: object properties: key: type: string name: type: string required: - key - name PublicActivityReviewBreakdown: type: object properties: approvals: type: integer format: int64 changeRequests: type: integer format: int64 commentReviews: type: integer format: int64 required: - approvals - changeRequests - commentReviews PublicActivityWork: type: object properties: actions: type: array items: $ref: "#/components/schemas/ActivityAction" id: type: string lastOccurredAt: type: string format: date-time work: $ref: "#/components/schemas/PublicActivityWorkSummary" required: - actions - id - lastOccurredAt - work PublicActivityWorkPage: type: object description: "One page of the selected person's published work; no account,\ \ author or other participant data." properties: content: type: array items: $ref: "#/components/schemas/PublicActivityWork" nextCursor: type: string required: - content PublicActivityWorkSummary: type: object properties: htmlUrl: type: string isDraft: type: boolean number: type: integer format: int32 repository: $ref: "#/components/schemas/PublicActivityRepository" state: type: string enum: - OPEN - CLOSED - MERGED title: type: string type: type: string enum: - PULL_REQUEST - ISSUE required: - htmlUrl - isDraft - number - repository - state - title - type PublicActivityWorkspaceSettings: type: object properties: allowSearchEngines: type: boolean enabled: type: boolean required: - allowSearchEngines - enabled PublicFeedbackHistory: type: object description: |- One authorized history read. publicationContext names this exact response: preparation of a public piece composed from it must send it back unchanged. properties: contractVersion: type: integer format: int32 history: $ref: "#/components/schemas/History" publicationContext: type: - string - "null" readAt: type: string format: date-time required: - contractVersion - history - publicationContext - readAt Question: type: object properties: allowOther: type: boolean description: a choice question also takes one free-text answer; false when a stored question omits it highLabel: type: string maxLength: 60 minLength: 0 id: type: string maxLength: 80 minLength: 0 pattern: "[A-Za-z0-9_-]+" lowLabel: type: string maxLength: 60 minLength: 0 options: type: array items: type: string maxLength: 200 minLength: 0 maxItems: 20 minItems: 0 prompt: type: string maxLength: 300 minLength: 0 required: type: boolean type: type: string enum: - TEXT - SINGLE_CHOICE - MULTIPLE_CHOICE - RATING - NPS required: - allowOther - id - options - prompt - required - type QuestionSummary: type: object properties: answered: type: integer format: int64 average: type: number format: double counts: type: array items: $ref: "#/components/schemas/OptionCount" other: type: integer format: int64 description: responses whose choices include a free-text answer; present for choice questions only questionId: type: string score: type: integer format: int32 description: "Net Promoter Score, −100…100, for an NPS question" required: - answered - counts - questionId Queued: type: object description: Conversation feedback not yet delivered that a new piece on practiceSlug may replace. properties: basedOn: type: array items: $ref: "#/components/schemas/PrivateFeedbackHistoryBasis" body: type: - string - "null" bodyRole: type: - string - "null" enum: - PRACTICE_PAGE_CARD - CONVERSATION_WORDS - MENTOR_NOTES - null destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION feedbackId: type: string format: uuid practiceSlug: type: string preparedAt: type: string format: date-time recordedClaimCurrentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE threadKey: type: string required: - basedOn - body - bodyRole - destination - feedbackId - practiceSlug - preparedAt - recordedClaimCurrentness - threadKey QuietDecision: type: object properties: basedOn: type: array items: $ref: "#/components/schemas/Support" reason: type: string witnessIds: type: array items: type: string RateLimitSnapshot: type: object description: "Vendor API rate-limit observation, read from in-memory trackers\ \ (not persisted across restarts). Every field except observedAt is present\ \ only if the vendor actually reported it." properties: limit: type: integer format: int32 description: "Window ceiling, if the vendor reported one. Survives window\ \ rollover — a ceiling is window-invariant." observedAt: type: string format: date-time description: When the underlying vendor response was seen remaining: type: integer format: int32 description: "Remaining budget, if reported and still inside the observed\ \ window. Null once the window has rolled over." resetAt: type: string format: date-time description: "When the observed window ends, if reported and still in the\ \ future" throttledUntil: type: string format: date-time description: An observed 429's back-off deadline (observedAt + Retry-After); null if the vendor never told us to back off required: - observedAt ReadReceipt: type: object properties: contentDigest: type: string endLine: type: integer format: int32 path: type: string sourceKind: type: string sourcePath: type: string startLine: type: integer format: int32 status: type: string enum: - COMPLETE - TRUNCATED - FAILED - BINARY - ABSENT version: type: string ReadSourceOption: type: object properties: citation: $ref: "#/components/schemas/CitationCapabilities" label: type: string needs: type: array items: type: string enum: - REQUIRED - COMPLETE - OPTIONAL source: type: string required: - citation - label - needs - source ReasonCount: type: object properties: count: type: integer format: int32 description: type: string reason: type: string required: - count - description - reason RegisterOutlineCollectionRequest: type: object description: Register an Outline collection for mirroring (lands ENABLED + PENDING) properties: collectionId: type: string description: Outline collection id (UUID) maxLength: 64 minLength: 0 required: - collectionId RegisterSlackChannelRequest: type: object description: Allow-list a Slack channel (lands in PENDING) properties: channelName: type: string description: Optional human-readable channel name to store alongside the id maxLength: 256 minLength: 0 slackChannelId: type: string description: Slack public/private channel id (stable C… or G… id) maxLength: 32 minLength: 0 pattern: "^[CG][A-Z0-9]{8,}$" required: - slackChannelId ReleaseStart: type: object description: A release the server role started on this instance. properties: channel: type: string enum: - RELEASE - COMMIT - DEVELOPMENT commit: type: string environment: type: string image: type: string startedAt: type: string format: date-time description: when the server role first started this release; a restart does not change it version: type: string required: - channel - environment - startedAt - version ReleaseStatus: type: object description: |- The running release and what the last update check found. Discovery is advisory: nothing here verifies an artifact or performs an upgrade. properties: failure: type: string description: "why the last attempt did not complete, when status\ \ is FAILED" enum: - RATE_LIMITED - UNAVAILABLE - MALFORMED history: type: array description: "the releases this instance ran, newest first" items: $ref: "#/components/schemas/ReleaseStart" lastAttempt: type: string format: date-time description: "when a check was last started, on any outcome" lastSuccess: type: string format: date-time description: "when a check last completed, which is when latest\ \ was observed" latest: $ref: "#/components/schemas/LatestRelease" description: the newest published release as of lastSuccess nextCheck: type: string format: date-time description: when the next automatic check is due retryUntil: type: string format: date-time description: the wait GitHub named on a rate limit; a manual check before it is refused running: $ref: "#/components/schemas/RunningRelease" description: the identity this process reports runningSince: type: string format: date-time description: "when this instance started the running release, absent unless\ \ the newest start is it" status: type: string description: the verdict an administrator reads first enum: - DISABLED - NOT_APPLICABLE - NEVER_CHECKED - CURRENT - UPDATE_AVAILABLE - FAILED required: - history - running - status RemovalGuard: type: object properties: previousFiles: type: integer format: int32 state: type: string enum: - APPLIED - NOT_NEEDED - INCOMPLETE_LISTING - SUSPECT_LISTING wouldRemove: type: integer format: int32 required: - previousFiles - state - wouldRemove RemoveResultMarkRequest: type: object properties: reason: type: string required: - reason RenameWorkspaceSlugRequest: type: object description: Request to rename a workspace's URL slug properties: newSlug: type: string description: Non-reserved lowercase ASCII DNS label. Consecutive hyphens are prohibited. example: new-workspace-slug maxLength: 51 minLength: 3 pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$" required: - newSlug ReorderRequest: type: object properties: slugs: type: array items: type: string maxLength: 64 minLength: 0 pattern: "[a-z0-9]+(?:-[a-z0-9]+)*" maxItems: 10000 minItems: 0 required: - slugs RepositoryInfo: type: object description: Information about a git repository properties: description: type: string description: Description of the repository hiddenFromContributions: type: boolean description: Whether activity in this repository is left out of a team's activity htmlUrl: type: string description: URL to the repository on the git provider id: type: integer format: int64 description: Unique identifier of the repository labels: type: array description: Labels defined in the repository items: $ref: "#/components/schemas/LabelInfo" name: type: string description: Name of the repository nameWithOwner: type: string description: "Full name including owner (e.g., 'owner/repo')" required: - hiddenFromContributions - htmlUrl - id - name - nameWithOwner ResearchConsent: type: object properties: granted: type: boolean noticeVersion: type: string researchOrganization: type: string description: The organization this control named on screen required: - granted - noticeVersion ResourceCounts: type: object description: Resource-level rollup for the connection overview badge properties: errored: type: integer format: int64 description: Resources currently reporting a sync error pending: type: integer format: int64 description: "Resources that have never completed a sync (no lastSyncedAt).\ \ Defined on the timestamp rather than on a provider's status vocabulary\ \ so it means the same thing for a repository, a Slack channel and an\ \ Outline collection." stale: type: integer format: int64 description: "Resources whose last sync is older than twice the connection's\ \ scheduled cadence. Always 0 when the cadence is unknown or the schedule\ \ is irregular — staleness is a judgement against a known cron, and without\ \ one this declines to guess rather than flagging healthy resources." total: type: integer format: int64 description: Total resources known to this connection required: - errored - pending - stale - total ResultCoverage: discriminator: propertyName: source properties: source: type: string required: - source ResultDecision: type: object properties: decision: type: string enum: - ADMIT - FEEDBACK_OFF - MENTOR_UNAVAILABLE - GATE_REFUSED - UNATTRIBUTABLE_SUBJECT - HAS_INLINE_ANCHOR - ALREADY_DELIVERED_ON_WORK - REVIEWER_DEFERRED - BACKFILL_QUIET resultId: type: string format: uuid stopReason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null required: - decision - resultId - stopReason ResultDetail: type: object properties: acceptedAt: type: - string - "null" format: date-time coverage: anyOf: - oneOf: - $ref: "#/components/schemas/ClaimedCoverage" - $ref: "#/components/schemas/HostCoverage" - type: "null" currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE endReason: type: - string - "null" enum: - REPLACED - OUTRANKED - WORK_CHANGED - REPAIRED - REMOVED - null endedAt: type: - string - "null" format: date-time evidence: anyOf: - $ref: "#/components/schemas/ResultEvidence" - type: "null" example: anyOf: - $ref: "#/components/schemas/ResultExample" - type: "null" explanation: type: - string - "null" feedback: type: array items: $ref: "#/components/schemas/OwnFeedbackRef" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" markedIncorrectAt: type: - string - "null" format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string practiceVersionId: type: - string - "null" pattern: "^[1-9][0-9]*$" practiceVersionNumber: type: - "null" - integer format: int32 problems: type: array items: $ref: "#/components/schemas/Problem" recordedAt: type: string format: date-time reviewId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null summary: type: - string - "null" required: - acceptedAt - coverage - currentness - endReason - endedAt - evidence - example - explanation - feedback - id - item - itemVersion - markedIncorrectAt - origin - outcome - practiceName - practiceSlug - practiceVersionId - practiceVersionNumber - problems - recordedAt - reviewId - severity - summary ResultEvidence: type: object properties: citations: type: array items: $ref: "#/components/schemas/EvidenceCitation" inapplicability: anyOf: - $ref: "#/components/schemas/InapplicabilityWarrant" - type: "null" openQuestions: type: array items: $ref: "#/components/schemas/OpenQuestion" search: anyOf: - $ref: "#/components/schemas/SearchWarrant" - type: "null" required: - citations - inapplicability - openQuestions - search ResultExample: type: object properties: citation: $ref: "#/components/schemas/EvidenceCitation" note: type: string required: - citation - note ResultList: type: object properties: acceptedAt: type: - string - "null" format: date-time currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" markedIncorrectAt: type: - string - "null" format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string problems: type: array items: $ref: "#/components/schemas/ProblemSummary" recordedAt: type: string format: date-time reviewId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null summary: type: - string - "null" required: - acceptedAt - currentness - id - item - markedIncorrectAt - origin - outcome - practiceName - practiceSlug - problems - recordedAt - reviewId - severity - summary ResultMark: type: object properties: createdAt: type: string format: date-time createdBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" id: type: string format: uuid kind: type: string enum: - INCORRECT - ACCEPTED reason: type: string removalReason: type: - string - "null" removedAt: type: - string - "null" format: date-time removedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" resultId: type: string format: uuid required: - createdAt - createdBy - id - kind - reason - removalReason - removedAt - removedBy - resultId ReusedScanReportItem: allOf: - type: object properties: currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE item: $ref: "#/components/schemas/ItemRef" itemVersion: type: string outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string problemCount: type: integer format: int32 recordedAt: type: string format: date-time resultId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null sourceReviewId: type: string format: uuid status: type: string enum: - REUSED summary: type: - string - "null" required: - currentness - item - itemVersion - outcome - practiceName - practiceSlug - problemCount - recordedAt - resultId - severity - sourceReviewId - status - summary Review: type: object properties: activeJobCount: type: integer format: int32 batchId: type: - string - "null" format: uuid completedAt: type: - string - "null" format: date-time createdAt: type: string format: date-time feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" jobCount: type: integer format: int32 kind: type: string enum: - ITEM - SCAN model: type: - string - "null" orderedAt: type: string format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL practices: type: array items: $ref: "#/components/schemas/ReviewPractice" requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" results: $ref: "#/components/schemas/ReviewResultCounts" startedBy: anyOf: - $ref: "#/components/schemas/ItemEvent" - type: "null" status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED stopReason: type: - string - "null" enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED - null required: - activeJobCount - batchId - completedAt - createdAt - feedback - id - item - itemVersion - jobCount - kind - model - orderedAt - origin - practices - requestedBy - results - startedBy - status - stopReason ReviewBatch: type: object properties: budgetUsd: type: - string - "null" confirmedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" createdAt: type: string format: date-time estimatedCostUsd: type: - string - "null" estimatedItems: type: integer format: int32 etag: type: string failedCount: type: integer format: int32 finishedAt: type: - string - "null" format: date-time from: type: - string - "null" format: date-time id: type: string format: uuid itemKind: type: string origin: type: string enum: - BACKFILL - SCHEDULE pauseReason: type: - string - "null" enum: - BUDGET_EXHAUSTED - REVIEW_MODEL_UNBOUND - WORKSPACE_UNAVAILABLE - PAUSED_BY_ADMIN - null requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" reviewIds: type: array items: type: string format: uuid scheduleId: type: - string - "null" format: uuid skippedCount: type: integer format: int32 startedAt: type: - string - "null" format: date-time status: type: string enum: - AWAITING_CONFIRMATION - RUNNING - PAUSED - COMPLETED - CANCELLED submittedCount: type: integer format: int32 targetItemIds: type: string pattern: "^[1-9][0-9]*$" to: type: - string - "null" format: date-time version: type: string required: - budgetUsd - confirmedBy - createdAt - estimatedCostUsd - estimatedItems - etag - failedCount - finishedAt - from - id - itemKind - origin - pauseReason - requestedBy - reviewIds - scheduleId - skippedCount - startedAt - status - submittedCount - targetItemIds - to - version ReviewBoundFeedback: type: object properties: deliveredAt: type: - string - "null" format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION id: type: string format: uuid state: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED withdrawn: type: boolean required: - deliveredAt - destination - id - state - withdrawn ReviewBoundResult: type: object properties: currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string recordedAt: type: string format: date-time reviewId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null summary: type: - string - "null" required: - currentness - developer - id - item - outcome - practiceName - practiceSlug - recordedAt - reviewId - severity - summary ReviewBucket: type: object properties: feedback: type: integer format: int32 results: type: integer format: int32 reviews: type: integer format: int32 start: type: string format: date-time required: - feedback - results - reviews - start ReviewContext: type: object properties: canInspectReviewDetails: type: boolean item: anyOf: - $ref: "#/components/schemas/ItemRef" - type: "null" reasonDescription: type: - string - "null" requestAllowed: type: boolean workspaceId: type: string pattern: "^[1-9][0-9]*$" workspaceSlug: type: string required: - canInspectReviewDetails - item - reasonDescription - requestAllowed - workspaceId - workspaceSlug ReviewDetail: type: object properties: activeJobCount: type: integer format: int32 batchId: type: - string - "null" format: uuid completedAt: type: - string - "null" format: date-time createdAt: type: string format: date-time feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" generatedPaths: anyOf: - $ref: "#/components/schemas/GeneratedPathReview" - type: "null" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" jobCount: type: integer format: int32 kind: type: string enum: - ITEM - SCAN model: type: - string - "null" orderedAt: type: string format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL practices: type: array items: $ref: "#/components/schemas/ReviewPractice" requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" results: $ref: "#/components/schemas/ReviewResultCounts" runtime: anyOf: - $ref: "#/components/schemas/ReviewRuntime" - type: "null" stageTiming: type: array items: $ref: "#/components/schemas/ReviewStageTiming" startedBy: anyOf: - $ref: "#/components/schemas/ItemEvent" - type: "null" status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED stopReason: type: - string - "null" enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED - null usage: $ref: "#/components/schemas/ReviewUsage" required: - activeJobCount - batchId - completedAt - createdAt - feedback - generatedPaths - id - item - itemVersion - jobCount - kind - model - orderedAt - origin - practices - requestedBy - results - runtime - stageTiming - startedBy - status - stopReason - usage ReviewDeveloper: type: object properties: accountId: type: string pattern: "^[1-9][0-9]*$" avatarUrl: type: - string - "null" displayName: type: - string - "null" providerLogin: type: - string - "null" required: - accountId - avatarUrl - displayName - providerLogin ReviewEvidenceOutcome: type: object properties: notReviewed: type: integer format: int32 outcomes: $ref: "#/components/schemas/OutcomeVector" practiceName: type: string practiceSlug: type: string withheld: type: integer format: int32 required: - notReviewed - outcomes - practiceName - practiceSlug - withheld ReviewFeedback: type: object properties: bodyPreview: type: - string - "null" bodyTruncated: type: boolean copyCounts: $ref: "#/components/schemas/FeedbackCopyCounts" createdAt: type: string format: date-time deliveredAt: type: - string - "null" format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION developer: $ref: "#/components/schemas/ReviewDeveloper" disagreedAt: type: - string - "null" format: date-time id: type: string format: uuid item: anyOf: - $ref: "#/components/schemas/ItemRef" - type: "null" location: type: string enum: - GITHUB - GITLAB - OTHER_WORK - HEPH - SLACK - NEXT_CONVERSATION - PRACTICE_PAGES replacesId: type: - string - "null" format: uuid resultCount: type: integer format: int32 reviewId: type: string format: uuid state: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED stopReason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null textHidden: type: boolean unverifiedHistory: type: boolean withdrawn: type: boolean required: - bodyPreview - bodyTruncated - copyCounts - createdAt - deliveredAt - destination - developer - disagreedAt - id - item - location - replacesId - resultCount - reviewId - state - stopReason - textHidden - unverifiedHistory - withdrawn ReviewFeedbackCounts: type: object properties: awaitingApproval: type: integer format: int32 delivered: type: integer format: int32 failed: type: integer format: int32 ready: type: integer format: int32 rejected: type: integer format: int32 replaced: type: integer format: int32 unconfirmed: type: integer format: int32 withheld: type: integer format: int32 required: - awaitingApproval - delivered - failed - ready - rejected - replaced - unconfirmed - withheld ReviewFeedbackDetail: type: object properties: basis: type: array items: $ref: "#/components/schemas/FeedbackBasis" body: type: - string - "null" bodyPreview: type: - string - "null" bodyTruncated: type: boolean checks: type: array items: $ref: "#/components/schemas/FeedbackCheck" contentDigest: type: - string - "null" copies: type: array items: $ref: "#/components/schemas/FeedbackCopy" copyCounts: $ref: "#/components/schemas/FeedbackCopyCounts" createdAt: type: string format: date-time decisions: type: array items: $ref: "#/components/schemas/FeedbackDecision" deliveredAt: type: - string - "null" format: date-time destination: type: string enum: - ON_WORK - PRACTICE_PAGE - CONVERSATION developer: $ref: "#/components/schemas/ReviewDeveloper" disagreedAt: type: - string - "null" format: date-time id: type: string format: uuid item: anyOf: - $ref: "#/components/schemas/ItemRef" - type: "null" location: type: string enum: - GITHUB - GITLAB - OTHER_WORK - HEPH - SLACK - NEXT_CONVERSATION - PRACTICE_PAGES replacesId: type: - string - "null" format: uuid response: anyOf: - $ref: "#/components/schemas/FeedbackResponse" - type: "null" resultCount: type: integer format: int32 reviewId: type: string format: uuid sends: type: array items: $ref: "#/components/schemas/FeedbackSend" state: type: string enum: - AWAITING_APPROVAL - READY - DELIVERED - UNCONFIRMED - WITHHELD - REJECTED - REPLACED - FAILED stopReason: type: - string - "null" enum: - VOLUME_CAPPED - COMPOSER_WITHHELD - NOTHING_NEW - REPEATS_DELIVERED_NOTE - REACTED_DISAGREE - REACTED_NOT_APPLICABLE - CONVERSATION_EXPIRED - DELIVERY_UNCONFIRMED - ITEM_GONE - ITEM_CLOSED - ITEM_MERGED - ITEM_STATE_INELIGIBLE - ISSUE_SNAPSHOT_CHANGED - PUBLIC_SUBJECT_INELIGIBLE - NO_AI - DELIVERY_OFF - PERSON_SUPPRESSED - RECIPIENT_UNAVAILABLE - EMPTY_AFTER_SANITIZE - INSTANCE_SILENCED - FEEDBACK_OFF - WORKSPACE_DISABLED - WORKSPACE_DELIVERY_PAUSED - STALE_ROLLOUT_REVISION - OUTSIDE_CURRENT_SCOPE - APPROVAL_STALE - APPROVAL_NO_LONGER_ELIGIBLE - PRACTICE_REQUIRES_APPROVAL - BACKFILL_QUIET - RESULT_MARKED_INCORRECT - REVIEWED_VERSION_CHANGED - REVIEW_CANCELLED - EVIDENCE_NOT_PERMITTED - NO_EVIDENCE - UNCORROBORATED - PUBLIC_HISTORY_CHANGED - PUBLIC_DELIVERY_UNRESOLVED - null textHidden: type: boolean unverifiedHistory: type: boolean withdrawn: type: boolean required: - basis - body - bodyPreview - bodyTruncated - checks - contentDigest - copies - copyCounts - createdAt - decisions - deliveredAt - destination - developer - disagreedAt - id - item - location - replacesId - response - resultCount - reviewId - sends - state - stopReason - textHidden - unverifiedHistory - withdrawn ReviewItemCounts: type: object properties: listed: type: integer format: int32 notReviewed: type: integer format: int32 reused: type: integer format: int32 reviewed: type: integer format: int32 withheld: type: integer format: int32 required: - listed - notReviewed - reused - reviewed - withheld ReviewJob: type: object properties: attempt: type: integer format: int32 availableAt: type: string format: date-time completedAt: type: - string - "null" format: date-time errorMessage: type: - string - "null" exitCode: type: - "null" - integer format: int32 id: type: string format: uuid processingStatus: type: string enum: - NONE - PENDING - DONE - FAILED startedAt: type: - string - "null" format: date-time status: type: string enum: - QUEUED - RUNNING - COMPLETED - FAILED - TIMED_OUT - CANCELLED traceId: type: string required: - attempt - availableAt - completedAt - errorMessage - exitCode - id - processingStatus - startedAt - status - traceId ReviewLimit: type: object properties: code: type: string description: type: string required: - code - description ReviewLimitInput: type: object additionalProperties: false properties: code: type: - string - "null" maxLength: 64 minLength: 0 description: type: string maxLength: 2000 minLength: 0 required: - description ReviewLineage: type: object properties: edges: type: array items: $ref: "#/components/schemas/ReviewLineageEdge" nodes: type: array items: $ref: "#/components/schemas/ReviewLineageNode" rootId: type: string required: - edges - nodes - rootId ReviewLineageEdge: type: object properties: from: type: string relation: type: string to: type: string required: - from - relation - to ReviewLineageNode: type: object properties: feedback: anyOf: - $ref: "#/components/schemas/ReviewBoundFeedback" - type: "null" id: type: string item: anyOf: - $ref: "#/components/schemas/ItemRef" - type: "null" kind: type: string enum: - ITEM - REVIEW - RESULT - PROBLEM - FEEDBACK problem: anyOf: - $ref: "#/components/schemas/ProblemSummary" - type: "null" result: anyOf: - $ref: "#/components/schemas/ReviewBoundResult" - type: "null" review: anyOf: - $ref: "#/components/schemas/ReviewRef" - type: "null" required: - feedback - id - item - kind - problem - result - review ReviewMethod: type: object properties: epoch: type: integer format: int32 modelDigest: type: string models: type: array items: $ref: "#/components/schemas/BoundModelSlot" required: - epoch - modelDigest - models ReviewOn: type: object properties: events: type: array items: type: string state: type: object additionalProperties: type: array items: type: string uniqueItems: true required: - events - state ReviewOverview: type: object properties: bucket: type: string enum: - DAY - WEEK - MONTH buckets: type: array items: $ref: "#/components/schemas/ReviewBucket" feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" from: type: string format: date-time practices: type: array items: $ref: "#/components/schemas/ReviewPracticeCounts" results: $ref: "#/components/schemas/ReviewResultCounts" resultsMarkedIncorrect: type: integer format: int32 reviews: $ref: "#/components/schemas/ReviewStatusCounts" to: type: string format: date-time required: - bucket - buckets - feedback - from - practices - results - resultsMarkedIncorrect - reviews - to ReviewPractice: type: object properties: itemCounts: $ref: "#/components/schemas/ReviewItemCounts" number: type: - "null" - integer format: int32 practiceName: type: string practiceSlug: type: string practiceVersionId: type: - string - "null" pattern: "^[1-9][0-9]*$" reason: type: - string - "null" results: $ref: "#/components/schemas/ReviewResultCounts" script: anyOf: - $ref: "#/components/schemas/PracticeScriptRun" - type: "null" status: type: string enum: - QUEUED - READY - RUNNING - DONE - WITHHELD - FAILED required: - itemCounts - number - practiceName - practiceSlug - practiceVersionId - reason - results - script - status ReviewPracticeCounts: type: object properties: feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" group: anyOf: - $ref: "#/components/schemas/GroupRef" - type: "null" practiceName: type: string practiceSlug: type: string results: $ref: "#/components/schemas/ReviewResultCounts" resultsMarkedIncorrect: type: integer format: int32 required: - feedback - group - practiceName - practiceSlug - results - resultsMarkedIncorrect ReviewProblem: type: object properties: acceptedAt: type: - string - "null" format: date-time currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" disagreedAt: type: - string - "null" format: date-time endLine: type: - "null" - integer format: int32 evidenceHidden: type: boolean group: anyOf: - $ref: "#/components/schemas/GroupRef" - type: "null" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" markedIncorrectAt: type: - string - "null" format: date-time path: type: - string - "null" practiceName: type: string practiceSlug: type: string recordedAt: type: string format: date-time resultId: type: string format: uuid reviewId: type: string format: uuid severity: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL side: type: - string - "null" enum: - OLD - NEW - null sourceKind: type: - string - "null" startLine: type: - "null" - integer format: int32 summary: type: string required: - acceptedAt - currentness - developer - disagreedAt - endLine - evidenceHidden - group - id - item - markedIncorrectAt - path - practiceName - practiceSlug - recordedAt - resultId - reviewId - severity - side - sourceKind - startLine - summary ReviewProblemDetail: type: object properties: acceptedAt: type: - string - "null" format: date-time currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" disagreedAt: type: - string - "null" format: date-time endLine: type: - "null" - integer format: int32 evidenceHidden: type: boolean group: anyOf: - $ref: "#/components/schemas/GroupRef" - type: "null" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" markedIncorrectAt: type: - string - "null" format: date-time path: type: - string - "null" practiceName: type: string practiceSlug: type: string problem: $ref: "#/components/schemas/Problem" recordedAt: type: string format: date-time result: $ref: "#/components/schemas/ReviewBoundResult" resultId: type: string format: uuid reviewId: type: string format: uuid severity: type: string enum: - CRITICAL - MAJOR - MINOR - TRIVIAL side: type: - string - "null" enum: - OLD - NEW - null sourceKind: type: - string - "null" startLine: type: - "null" - integer format: int32 summary: type: string required: - acceptedAt - currentness - developer - disagreedAt - endLine - evidenceHidden - group - id - item - markedIncorrectAt - path - practiceName - practiceSlug - problem - recordedAt - result - resultId - reviewId - severity - side - sourceKind - startLine - summary ReviewQueue: type: object properties: activeWorkers: type: integer format: int64 asOf: type: string format: date-time finishedLastDay: type: integer format: int64 finishedLastHour: type: integer format: int64 finishedPerHourLastDay: type: number format: double head: type: array items: $ref: "#/components/schemas/ReviewQueueItem" heldForBudget: type: integer format: int64 oldestWaitingSince: type: - string - "null" format: date-time running: type: integer format: int64 waiting: type: integer format: int64 required: - activeWorkers - asOf - finishedLastDay - finishedLastHour - finishedPerHourLastDay - head - heldForBudget - oldestWaitingSince - running - waiting ReviewQueueItem: type: object properties: developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" heldForBudget: type: boolean item: $ref: "#/components/schemas/ItemRef" jobId: type: string format: uuid reviewId: type: string format: uuid since: type: string format: date-time status: type: string enum: - QUEUED - RUNNING - COMPLETED - FAILED - TIMED_OUT - CANCELLED required: - developer - heldForBudget - item - jobId - reviewId - since - status ReviewRef: type: object properties: completedAt: type: - string - "null" format: date-time createdAt: type: string format: date-time id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" kind: type: string enum: - ITEM - SCAN origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED required: - completedAt - createdAt - id - item - itemVersion - kind - origin - status ReviewRequestOutcome: type: object properties: reason: type: - string - "null" enum: - GATE_WITHHELD - COOLDOWN_ACTIVE - REQUEST_COOLDOWN_ACTIVE - REQUESTER_QUOTA_EXHAUSTED - CONCURRENT_DUPLICATE - COALESCED - OUT_OF_REVIEW_SCOPE - BOT_AUTHOR - BOT_REVIEWER - STALE_ROLLOUT_REVISION - WORKSPACE_INACTIVE - PRACTICES_DISABLED - NO_ACTIVE_PRACTICE - REVIEW_MODEL_UNBOUND - MEMBER_AI_DECLINED - PERSON_DATA_ERASED - FEEDBACK_MODE_OFF - SUBJECT_UNLINKED - MERGE_ACTOR_UNAVAILABLE - MODEL_UNAVAILABLE - BUDGET_EXHAUSTED - ITEM_NOT_VISIBLE - VERSION_SUPERSEDED - PENDING_DEADLINE_EXCEEDED - ITEM_GONE - LEGACY_REVIEW_UNBOUND - null reviewId: type: - string - "null" format: uuid status: type: string enum: - SUBMITTED - REFUSED required: - reason - reviewId - status ReviewResult: type: object properties: acceptedAt: type: - string - "null" format: date-time currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" markedIncorrectAt: type: - string - "null" format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string problemCount: type: integer format: int32 problems: type: array items: $ref: "#/components/schemas/ProblemSummary" recordedAt: type: string format: date-time reviewId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null summary: type: - string - "null" required: - acceptedAt - currentness - developer - feedback - id - item - markedIncorrectAt - origin - outcome - practiceName - practiceSlug - problemCount - problems - recordedAt - reviewId - severity - summary ReviewResultCounts: type: object properties: couldNotDetermine: type: integer format: int32 doesNotApply: type: integer format: int32 met: type: integer format: int32 notMet: type: integer format: int32 required: - couldNotDetermine - doesNotApply - met - notMet ReviewResultDetail: type: object properties: acceptedAt: type: - string - "null" format: date-time coverage: anyOf: - oneOf: - $ref: "#/components/schemas/ClaimedCoverage" - $ref: "#/components/schemas/HostCoverage" - type: "null" currentness: type: string enum: - CURRENT - STALE - UNVERIFIABLE developer: anyOf: - $ref: "#/components/schemas/ReviewDeveloper" - type: "null" disagreements: type: array items: $ref: "#/components/schemas/FeedbackDisagreement" endReason: type: - string - "null" enum: - REPLACED - OUTRANKED - WORK_CHANGED - REPAIRED - REMOVED - null endedAt: type: - string - "null" format: date-time evidence: anyOf: - $ref: "#/components/schemas/ResultEvidence" - type: "null" evidenceHidden: type: boolean evidenceVersion: type: integer format: int32 example: anyOf: - $ref: "#/components/schemas/ResultExample" - type: "null" explanation: type: - string - "null" feedback: type: array items: $ref: "#/components/schemas/ReviewBoundFeedback" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" markedIncorrectAt: type: - string - "null" format: date-time marks: type: array items: $ref: "#/components/schemas/ResultMark" origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceName: type: string practiceSlug: type: string practiceVersionId: type: - string - "null" pattern: "^[1-9][0-9]*$" practiceVersionNumber: type: - "null" - integer format: int32 problems: type: array items: $ref: "#/components/schemas/Problem" recordedAt: type: string format: date-time reviewId: type: string format: uuid severity: type: - string - "null" enum: - CRITICAL - MAJOR - MINOR - TRIVIAL - null summary: type: - string - "null" required: - acceptedAt - coverage - currentness - developer - disagreements - endReason - endedAt - evidence - evidenceHidden - evidenceVersion - example - explanation - feedback - id - item - itemVersion - markedIncorrectAt - marks - origin - outcome - practiceName - practiceSlug - practiceVersionId - practiceVersionNumber - problems - recordedAt - reviewId - severity - summary ReviewRuntime: type: object properties: jobs: type: array items: $ref: "#/components/schemas/ReviewJob" required: - jobs ReviewSchedule: type: object properties: budgetUsd: type: - string - "null" cadence: type: string enum: - DAILY - WEEKLY createdAt: type: string format: date-time createdBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" enabled: type: boolean id: type: string format: uuid itemKind: type: string lastRunAt: type: - string - "null" format: date-time lookbackDays: type: - "null" - integer format: int32 nextRunAt: type: string format: date-time updatedAt: type: string format: date-time version: type: string required: - budgetUsd - cadence - createdAt - createdBy - enabled - id - itemKind - lastRunAt - lookbackDays - nextRunAt - updatedAt - version ReviewScheduleInput: type: object properties: budgetUsd: type: - string - "null" cadence: type: string enum: - DAILY - WEEKLY enabled: type: boolean itemKind: type: string lookbackDays: type: - "null" - integer format: int32 required: - budgetUsd - cadence - enabled - itemKind - lookbackDays ReviewScopeRepository: type: object properties: baseBranches: type: array items: type: string repositoryItemId: type: string pattern: "[1-9][0-9]*" required: - baseBranches - repositoryItemId ReviewStageTiming: type: object properties: completedAt: type: - string - "null" format: date-time durationMs: type: - "null" - integer format: int32 stage: type: string startedAt: type: - string - "null" format: date-time required: - completedAt - durationMs - stage - startedAt ReviewStatusCounts: type: object properties: cancelled: type: integer format: int32 complete: type: integer format: int32 failed: type: integer format: int32 partial: type: integer format: int32 queued: type: integer format: int32 running: type: integer format: int32 required: - cancelled - complete - failed - partial - queued - running ReviewSummary: type: object properties: activeJobCount: type: integer format: int32 batchId: type: - string - "null" format: uuid completedAt: type: - string - "null" format: date-time createdAt: type: string format: date-time feedback: $ref: "#/components/schemas/ReviewFeedbackCounts" id: type: string format: uuid item: $ref: "#/components/schemas/ItemRef" itemVersion: type: - string - "null" jobCount: type: integer format: int32 kind: type: string enum: - ITEM - SCAN model: type: - string - "null" orderedAt: type: string format: date-time origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL practices: type: array items: $ref: "#/components/schemas/ReviewPractice" requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" results: $ref: "#/components/schemas/ReviewResultCounts" startedBy: anyOf: - $ref: "#/components/schemas/ItemEvent" - type: "null" status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED stopReason: type: - string - "null" enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED - null required: - activeJobCount - batchId - completedAt - createdAt - feedback - id - item - itemVersion - jobCount - kind - model - orderedAt - origin - practices - requestedBy - results - startedBy - status - stopReason ReviewTimeShares: type: object properties: asked: type: number format: double model: type: number format: double posted: type: - number - "null" format: double preparation: type: number format: double queue: type: number format: double runUnsplit: type: number format: double required: - asked - model - posted - preparation - queue - runUnsplit ReviewTiming: type: object properties: asked: $ref: "#/components/schemas/ReviewTimingStage" feedbackWithheldAsMerged: type: integer format: int64 finished: $ref: "#/components/schemas/ReviewTimingStage" finishedAfterMerge: type: integer format: int64 finishedAfterMergeStartedByMerge: type: integer format: int64 finishedShares: anyOf: - $ref: "#/components/schemas/ReviewTimeShares" - type: "null" from: type: string format: date-time model: $ref: "#/components/schemas/ReviewTimingStage" posted: $ref: "#/components/schemas/ReviewTimingStage" preparation: $ref: "#/components/schemas/ReviewTimingStage" queue: $ref: "#/components/schemas/ReviewTimingStage" read: $ref: "#/components/schemas/ReviewTimingStage" to: type: string format: date-time total: $ref: "#/components/schemas/ReviewTimingStage" totalShares: anyOf: - $ref: "#/components/schemas/ReviewTimeShares" - type: "null" waitingLong: type: integer format: int64 required: - asked - feedbackWithheldAsMerged - finished - finishedAfterMerge - finishedAfterMergeStartedByMerge - finishedShares - from - model - posted - preparation - queue - read - to - total - totalShares - waitingLong ReviewTimingStage: type: object properties: count: type: integer format: int64 medianSeconds: type: - number - "null" format: double p90Seconds: type: - number - "null" format: double required: - count - medianSeconds - p90Seconds ReviewUsage: type: object properties: attempts: type: array items: $ref: "#/components/schemas/ReviewUsageAttempt" calls: type: integer format: int64 costUsd: type: - string - "null" inputTokens: type: integer format: int64 outputTokens: type: integer format: int64 priced: type: boolean required: - attempts - calls - costUsd - inputTokens - outputTokens - priced ReviewUsageAttempt: type: object properties: attempt: type: integer format: int32 cacheReadTokens: type: integer format: int64 cacheWriteTokens: type: integer format: int64 calls: type: integer format: int64 costUsd: type: - string - "null" inputTokens: type: integer format: int64 jobId: type: string format: uuid outputTokens: type: integer format: int64 pricingState: type: string enum: - PRICED - NO_CHARGE - UNPRICED reasoningTokens: type: integer format: int64 required: - attempt - cacheReadTokens - cacheWriteTokens - calls - costUsd - inputTokens - jobId - outputTokens - pricingState - reasoningTokens ReviewedBy: type: object properties: by: type: string enum: - HEPHAESTUS - PEOPLE - NOBODY humanReason: anyOf: - $ref: "#/components/schemas/ReviewLimit" - type: "null" limits: type: array items: $ref: "#/components/schemas/ReviewLimit" required: - by - humanReason - limits ReviewedByInput: type: object additionalProperties: false properties: by: type: string enum: - HEPHAESTUS - PEOPLE - NOBODY humanReason: anyOf: - $ref: "#/components/schemas/ReviewLimitInput" - type: "null" limits: type: array items: $ref: "#/components/schemas/ReviewLimitInput" maxItems: 100 minItems: 0 required: - by - humanReason - limits ReviewedPractice: type: object properties: group: anyOf: - $ref: "#/components/schemas/GroupRef" - type: "null" name: type: string slug: type: string whatGoodLooksLike: type: - string - "null" whyItMatters: type: - string - "null" required: - group - name - slug - whatGoodLooksLike - whyItMatters Reviewer: type: object description: "Someone reviewing a pull request, and where their review stands" properties: state: type: string description: "REQUESTED while a review is asked of them, otherwise the verdict\ \ of their latest review that was not dismissed" enum: - CHANGES_REQUESTED - APPROVED - COMMENTED - REQUESTED user: $ref: "#/components/schemas/UserInfo" description: The reviewer required: - state - user RevokeSessionsResult: type: object properties: revoked: type: integer format: int32 required: - revoked RunningRelease: type: object description: |- Deployment-reported identity: the values the verified lock env handed this process, not an observation of the container. commit and image are absent outside a lock-driven deployment. properties: channel: type: string description: what kind of build that version names enum: - RELEASE - COMMIT - DEVELOPMENT commit: type: string description: the source commit the lock names environment: type: string description: the name the deployment gives this instance image: type: string description: the digest reference this container was started from roles: type: array description: the runtime roles this process booted with items: type: string enum: - SERVER - WORKER - WEBHOOK version: type: string description: the version the deployment passed as APP_VERSION required: - channel - environment - roles - version RuntimeNonResult: type: object description: "An assigned practice that runtime execution could not complete,\ \ without an outcome about the work." properties: practiceSlug: type: string reason: type: string enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED required: - practiceSlug - reason ScanAvailability: type: object properties: expired: type: boolean expiredProofPairs: type: integer format: int32 rawRetentionEndsAt: type: - string - "null" format: date-time withheldProofPairs: type: integer format: int32 required: - expired - expiredProofPairs - rawRetentionEndsAt - withheldProofPairs ScanCounts: type: object properties: couldNotDetermine: type: integer format: int32 doesNotApply: type: integer format: int32 files: type: - "null" - integer format: int32 met: type: integer format: int32 notMet: type: integer format: int32 notReviewed: type: integer format: int32 openProblems: type: integer format: int32 practiceItemPairs: type: - "null" - integer format: int32 problems: type: integer format: int32 reused: type: integer format: int32 reviewed: type: integer format: int32 withheld: type: integer format: int32 required: - couldNotDetermine - doesNotApply - files - met - notMet - notReviewed - openProblems - practiceItemPairs - problems - reused - reviewed - withheld ScanDefinition: type: object properties: context: type: array items: type: string exclude: type: array items: type: string include: type: array items: type: string itemKind: type: string reads: $ref: "#/components/schemas/PracticeReads" required: - context - exclude - include - itemKind - reads ScanDetail: type: object properties: baselineScanId: type: - string - "null" format: uuid budgetUsd: type: string chargedCostUsd: type: - string - "null" completedAt: type: - string - "null" format: date-time counts: $ref: "#/components/schemas/ScanCounts" createdAt: type: string format: date-time id: type: string format: uuid itemVersion: type: string origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL practiceCount: type: integer format: int32 practices: type: array items: $ref: "#/components/schemas/ScanPracticeRef" progress: $ref: "#/components/schemas/ScanProgress" ref: type: string repository: $ref: "#/components/schemas/ItemRef" requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" startedAt: type: - string - "null" format: date-time status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED stopReason: type: - string - "null" enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED - null required: - baselineScanId - budgetUsd - chargedCostUsd - completedAt - counts - createdAt - id - itemVersion - origin - practiceCount - practices - progress - ref - repository - requestedBy - startedAt - status - stopReason ScanExcludedFile: type: object properties: itemId: type: string path: type: string reason: type: string enum: - FILE_TOO_LARGE - BINARY_FILE sizeBytes: type: integer format: int64 required: - itemId - path - reason - sizeBytes ScanPracticeRef: type: object properties: number: type: integer format: int32 practiceId: type: string pattern: "^[1-9][0-9]*$" practiceName: type: string practiceSlug: type: string practiceVersionId: type: string pattern: "^[1-9][0-9]*$" reviewDigest: type: string required: - number - practiceId - practiceName - practiceSlug - practiceVersionId - reviewDigest ScanPracticeReport: type: object properties: comparison: type: string enum: - COMPARABLE - FIRST_SCAN - METHOD_CHANGED - STANDARD_CHANGED - INCOMPLETE - MIXED counts: $ref: "#/components/schemas/ScanCounts" listingComplete: type: boolean method: $ref: "#/components/schemas/ReviewMethod" number: type: integer format: int32 practiceId: type: string pattern: "^[1-9][0-9]*$" practiceName: type: string practiceSlug: type: string practiceVersionId: type: string pattern: "^[1-9][0-9]*$" reason: type: - string - "null" reviewDigest: type: string status: type: string enum: - QUEUED - READY - RUNNING - DONE - WITHHELD - FAILED required: - comparison - counts - listingComplete - method - number - practiceId - practiceName - practiceSlug - practiceVersionId - reason - reviewDigest - status ScanProgress: type: object properties: activeJobs: type: integer format: int32 listedPairs: type: - "null" - integer format: int32 queuedJobs: type: integer format: int32 terminalPairs: type: integer format: int32 required: - activeJobs - listedPairs - queuedJobs - terminalPairs ScanReport: type: object properties: availability: $ref: "#/components/schemas/ScanAvailability" baselineScanId: type: - string - "null" format: uuid comparison: type: string enum: - COMPARABLE - FIRST_SCAN - METHOD_CHANGED - STANDARD_CHANGED - INCOMPLETE - MIXED complete: type: boolean counts: $ref: "#/components/schemas/ScanCounts" exclusions: type: - "null" - array items: $ref: "#/components/schemas/ScanExcludedFile" listingComplete: type: boolean notReviewedReasons: type: array items: $ref: "#/components/schemas/ReasonCount" practices: type: array items: $ref: "#/components/schemas/ScanPracticeReport" problemChanges: $ref: "#/components/schemas/ProblemChanges" recordedCounts: anyOf: - $ref: "#/components/schemas/ScanCounts" - type: "null" removalGuard: $ref: "#/components/schemas/RemovalGuard" scan: $ref: "#/components/schemas/ScanSummary" withheldReasons: type: array items: $ref: "#/components/schemas/ReasonCount" required: - availability - baselineScanId - comparison - complete - counts - exclusions - listingComplete - notReviewedReasons - practices - problemChanges - recordedCounts - removalGuard - scan - withheldReasons ScanReportItem: discriminator: mapping: JUDGED: "#/components/schemas/JudgedScanReportItem" LISTED: "#/components/schemas/ListedScanReportItem" NOT_REVIEWED: "#/components/schemas/NotReviewedScanReportItem" REUSED: "#/components/schemas/ReusedScanReportItem" WITHHELD: "#/components/schemas/WithheldScanReportItem" propertyName: status oneOf: - $ref: "#/components/schemas/JudgedScanReportItem" - $ref: "#/components/schemas/ReusedScanReportItem" - $ref: "#/components/schemas/WithheldScanReportItem" - $ref: "#/components/schemas/ListedScanReportItem" - $ref: "#/components/schemas/NotReviewedScanReportItem" properties: status: type: string required: - status ScanReportItemsPage: type: object properties: content: type: array items: $ref: "#/components/schemas/ScanReportItem" hasNext: type: boolean nextCursor: type: - string - "null" required: - content - hasNext - nextCursor ScanReportProblem: type: object properties: absentReason: type: - string - "null" enum: - REPAIRED - null baselineState: type: - string - "null" enum: - NEW - UNCHANGED - UPDATED - ABSENT - null item: $ref: "#/components/schemas/ItemRef" practiceName: type: string practiceSlug: type: string previousProblemId: type: - string - "null" format: uuid problem: $ref: "#/components/schemas/Problem" resultId: type: string format: uuid required: - absentReason - baselineState - item - practiceName - practiceSlug - previousProblemId - problem - resultId ScanReportProblemsPage: type: object properties: content: type: array items: $ref: "#/components/schemas/ScanReportProblem" hasNext: type: boolean nextCursor: type: - string - "null" required: - content - hasNext - nextCursor ScanSummary: type: object properties: baselineScanId: type: - string - "null" format: uuid completedAt: type: - string - "null" format: date-time counts: $ref: "#/components/schemas/ScanCounts" createdAt: type: string format: date-time id: type: string format: uuid itemVersion: type: string origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL practiceCount: type: integer format: int32 ref: type: string repository: $ref: "#/components/schemas/ItemRef" requestedBy: anyOf: - $ref: "#/components/schemas/AccountRef" - type: "null" startedAt: type: - string - "null" format: date-time status: type: string enum: - QUEUED - RUNNING - COMPLETE - PARTIAL - FAILED - CANCELLED stopReason: type: - string - "null" enum: - TIMED_OUT - EXECUTION_FAILED - PREPARATION_FAILED - PROCESSING_FAILED - PERSON_DATA_ERASED - STALE_ROLLOUT_REVISION - CANCELLED_BY_ADMIN - REPLACED - LEGACY_FAILURE - EXECUTION_INCOMPLETE - RESULT_WITHHELD - READINESS_REFUSED - SUSPECT_LISTING - BUDGET - USAGE_UNVERIFIABLE - DEADLINE - CANCELLED - ENUMERATION_FAILED - ENUMERATION_LIMIT - NO_SCAN_PRACTICES - MODEL_CHANGED - MODEL_UNAVAILABLE - ERROR - LEGACY_SCOPE_UNKNOWN - CONTRACT_CHANGED - null required: - baselineScanId - completedAt - counts - createdAt - id - itemVersion - origin - practiceCount - ref - repository - requestedBy - startedAt - status - stopReason SearchWarrant: type: object properties: boundary: type: string consulted: type: array items: type: string lookedFor: type: string SessionView: type: object properties: client: type: string description: what signed in enum: - WEB - BROWSER_EXTENSION current: type: boolean expiresAt: type: string format: date-time description: "when the token expires; for an installed client, the session's\ \ own deadline" ip: type: string issuedAt: type: string format: date-time jti: type: string format: uuid userAgent: type: string required: - client - current - expiresAt - jti SetCatalogStatusRequest: type: object properties: excluded: type: boolean required: - excluded SetFeedbackModeRequest: type: object properties: feedbackMode: type: - string - "null" enum: - "OFF" - APPROVE_FIRST - AUTOMATIC - null required: - feedbackMode SetMemberHiddenRequest: type: object properties: hidden: type: boolean required: - hidden SetReviewScheduleEnabledRequest: type: object properties: enabled: type: boolean SlackChannelCandidate: type: object description: A Slack channel the app can offer in the workspace channel picker properties: archived: type: boolean description: Whether Slack reports the channel as archived channelName: type: string description: Current Slack channel name consentState: type: string description: "Existing Hephaestus monitoring state, if already allow-listed" enum: - PENDING - ACTIVE - PAUSED - REVOKED member: type: boolean description: Whether the app bot is already a member privateChannel: type: boolean description: Whether this is a private channel slackChannelId: type: string description: Stable Slack channel id required: - channelName - slackChannelId SlackChannelConsentEvent: type: object description: An immutable Slack channel consent-transition audit entry properties: actorAccountId: type: - string - "null" description: Account id of the admin who made the change pattern: "^[1-9][0-9]*$" createdAt: type: string format: date-time description: When the transition was recorded fromState: type: - string - "null" description: State the channel left (absent for the very first record) enum: - PENDING - ACTIVE - PAUSED - REVOKED - null id: type: string description: Audit entry id pattern: "^[1-9][0-9]*$" reason: type: - string - "null" description: Optional free-text reason the admin supplied slackChannelId: type: string description: Slack channel id the transition applied to toState: type: string description: State the channel entered enum: - PENDING - ACTIVE - PAUSED - REVOKED required: - actorAccountId - createdAt - fromState - id - reason - slackChannelId - toState SlackMonitoredChannel: type: object description: An allow-listed Slack channel with its consent state and person opt-out count properties: channelName: type: - string - "null" description: "Human-readable channel name, if known" consentAnnouncedAt: type: - string - "null" format: date-time description: When the in-channel consent announcement was posted (stamped on first activation) consentState: type: string description: Current per-channel consent lifecycle state enum: - PENDING - ACTIVE - PAUSED - REVOKED createdAt: type: string format: date-time description: When the channel was first discovered / allow-listed id: type: string description: Internal allow-list row id pattern: "^[1-9][0-9]*$" optedOutMemberCount: type: integer format: int64 description: Number of workspace members who have opted out of ingestion (workspace-wide) slackChannelId: type: string description: Slack channel id (stable C…/G… id; the natural key) slackTeamId: type: string description: Slack team (workspace) id the channel belongs to required: - channelName - consentAnnouncedAt - consentState - createdAt - id - optedOutMemberCount - slackChannelId - slackTeamId SlackUserPreferences: type: object properties: workspaces: type: array items: $ref: "#/components/schemas/SlackUserWorkspacePreferences" required: - workspaces SlackUserWorkspacePreferences: type: object properties: activeMonitoredChannelCount: type: integer format: int64 channelMessagesAllowed: type: boolean slackDisplayName: type: string slackTeamId: type: string slackTeamName: type: string slackUserId: type: string workspaceName: type: string workspaceSlug: type: string required: - slackTeamId - slackUserId - workspaceName - workspaceSlug Sort: type: object properties: empty: type: boolean sorted: type: boolean unsorted: type: boolean required: - empty - sorted - unsorted StartScanRequest: type: object properties: budgetUsd: type: string expectedVersion: type: - string - "null" maxLength: 1024 minLength: 1 practiceSlugs: type: - "null" - array items: type: string maxLength: 128 minLength: 0 maxItems: 1000 minItems: 1 ref: type: - string - "null" maxLength: 1024 minLength: 1 repositoryItemId: type: string pattern: "[1-9][0-9]*" reuse: type: - boolean - "null" required: - budgetUsd - expectedVersion - practiceSlugs - ref - repositoryItemId - reuse StateBasis: allOf: - $ref: "#/components/schemas/ClaimBasis" - type: object properties: explanation: type: string StateDimension: type: object properties: label: type: string name: type: string values: type: array items: $ref: "#/components/schemas/Value" required: - label - name - values SubmitSurvey: type: object properties: answers: type: array items: $ref: "#/components/schemas/Answer" maxItems: 20 minItems: 0 required: - answers SubmittedResult: type: object properties: candidate: $ref: "#/components/schemas/JsonNode" itemId: type: string itemVersion: type: string practiceSlug: type: string readReceipts: type: array items: $ref: "#/components/schemas/ReadReceipt" Support: type: object properties: problemId: type: string format: uuid resultId: type: string format: uuid SupportOccurrence: type: object properties: evidence: anyOf: - $ref: "#/components/schemas/JsonNode" - type: "null" explanation: type: - string - "null" itemId: type: string itemKind: type: string origin: type: string enum: - EVENT - REQUEST - SCHEDULE - BACKFILL outcome: type: string enum: - MET - NOT_MET - DOES_NOT_APPLY - COULD_NOT_DETERMINE practiceVersionId: type: - string - "null" recordedAt: type: string format: date-time resultId: type: string format: uuid summary: type: string required: - evidence - explanation - itemId - itemKind - origin - outcome - practiceVersionId - recordedAt - resultId - summary Survey: type: object properties: active: type: boolean createdAt: type: string format: date-time createdBy: $ref: "#/components/schemas/FeedbackAccountRef" description: type: string endsAt: type: string format: date-time id: type: string format: uuid participation: $ref: "#/components/schemas/ParticipationCounts" purpose: type: string enum: - PRODUCT - RESEARCH questions: type: array items: $ref: "#/components/schemas/Question" researchOrganization: type: string description: the organisation a research survey was published for; absent for a product survey startsAt: type: string format: date-time title: type: string workspace: $ref: "#/components/schemas/FeedbackWorkspaceRef" required: - active - createdAt - description - id - participation - purpose - questions - startsAt - title SurveyEdit: type: object properties: active: type: boolean description: type: string maxLength: 500 minLength: 0 endsAt: type: string format: date-time startsAt: type: string format: date-time title: type: string maxLength: 160 minLength: 0 required: - active - description - startsAt - title SurveyEmailInvitationRequest: type: object properties: sendReminder: type: boolean SurveyEmailInvitationSummary: type: object description: "Counts refer to email requests, not in-app invitations or responses.\ \ Accepted means SMTP relay acceptance." properties: accepted: type: integer format: int32 alreadyRequested: type: integer format: int32 deliveryConfigured: type: boolean eligible: type: integer format: int32 queued: type: integer format: int32 remaining: type: integer format: int32 required: - accepted - alreadyRequested - deliveryConfigured - eligible - queued - remaining SurveyInvitation: type: object properties: description: type: string endsAt: type: string format: date-time id: type: string format: uuid purpose: type: string enum: - PRODUCT - RESEARCH questions: type: array items: $ref: "#/components/schemas/Question" researchOrganization: type: string description: "set for a research survey: the organisation whose study the\ \ answers join" seen: type: boolean description: the account has been shown this invitation; the webapp nudges only while false title: type: string required: - description - id - purpose - questions - seen - title SurveyResponse: type: object properties: account: $ref: "#/components/schemas/FeedbackAccountRef" answers: type: array items: $ref: "#/components/schemas/Answer" decidedAt: type: string format: date-time id: type: string format: uuid status: type: string enum: - INVITED - RESPONDED - DECLINED workspace: $ref: "#/components/schemas/FeedbackWorkspaceRef" required: - decidedAt - id - status SurveySummary: type: object properties: participation: $ref: "#/components/schemas/ParticipationCounts" questions: type: array items: $ref: "#/components/schemas/QuestionSummary" required: - participation - questions SyncJob: type: object description: One sync_job row — a single INITIAL/RECONCILIATION/BACKFILL pass for a connection properties: cancelRequested: type: boolean description: Whether a cooperative cancel was requested createdAt: type: string format: date-time description: When the job row was created errorSummary: type: string description: "Truncated error summary, set on FAILED" finishedAt: type: string format: date-time description: When the job finished (any terminal status) id: type: integer format: int64 description: Job id itemsProcessed: type: integer format: int32 description: "Coarse progress: items processed so far" itemsTotal: type: integer format: int32 description: "Coarse progress: total items, if known" progress: type: object additionalProperties: {} description: "Per-phase progress detail, integration-specific shape" startedAt: type: string format: date-time description: When the job started running status: type: string description: Job status enum: - PENDING - RUNNING - SUCCEEDED - SUCCEEDED_WITH_WARNINGS - FAILED - CANCELLED trigger: type: string description: What initiated this job enum: - SCHEDULED - MANUAL - LIFECYCLE - SYSTEM triggeredByAccountId: type: integer format: int64 description: "Account id of the admin who triggered this job, if MANUAL" type: type: string description: What kind of pass this is enum: - INITIAL - RECONCILIATION - BACKFILL required: - cancelRequested - createdAt - id - status - trigger - type SyncResourceCount: type: object description: "One entity class mirrored within a resource (issues, pull requests,\ \ comments, messages, …)" properties: count: type: integer format: int64 description: Mirrored row count for this class key: type: string description: Stable machine token for this class enum: - issues - pullRequests - issueComments - reviews - reviewComments - commits - messages - documents example: pullRequests label: type: string description: Display name example: Pull requests lastSyncedAt: type: string format: date-time description: When this class was last synced. Null means the integration does not track a per-class watermark — not that the class has never synced. required: - count - key - label SyncResourceState: type: object description: One synced resource (repository / channel / collection) — unified read-model row properties: backfillCompletedThrough: type: string format: date-time description: Per-resource backfill horizon backfillPercent: type: integer format: int32 description: Per-resource backfill percent counts: type: array description: "Per-entity-class breakdown behind itemCount. One entry per\ \ class the integration actually mirrors — 6 for an SCM repository, 1\ \ for a Slack channel or Outline collection. Never null; empty when the\ \ resource has never synced." items: $ref: "#/components/schemas/SyncResourceCount" externalId: type: string description: Vendor-side identifier id: type: integer format: int64 description: The integration's own row id itemCount: type: integer format: int64 description: Headline mirrored item count — the rollup of `counts` lastError: type: string description: "Last sync error, if any" lastSyncedAt: type: string format: date-time description: Last successful sync timestamp across all entity classes name: type: string description: Display name state: type: string description: Integration-defined status string type: type: string description: Resource kind enum: - REPOSITORY - CHANNEL - COLLECTION upstreamCount: type: integer format: int64 description: "Vendor-reported upstream count, if cheaply available" required: - counts - externalId - id - name - state - type TeamInfo: type: object description: "Detailed information about a team including members, repositories,\ \ and labels" properties: description: type: string description: Description of the team hidden: type: boolean description: Whether the team is hidden from workspace activity htmlUrl: type: string description: URL to the team's page on the git provider id: type: integer format: int64 description: Unique identifier of the team labels: type: array description: Labels configured as filters for this team items: $ref: "#/components/schemas/LabelInfo" members: type: array description: Members of the team (excluding bots) items: $ref: "#/components/schemas/UserInfo" membershipCount: type: integer format: int32 description: Total count of team memberships name: type: string description: Name of the team organization: type: string description: Organization the team belongs to parentId: type: integer format: int64 description: "ID of the parent team, if this is a sub-team" privacy: type: string description: Privacy level of the team (SECRET or VISIBLE) enum: - SECRET - VISIBLE repoPermissionCount: type: integer format: int32 description: Count of repository permissions repositories: type: array description: Repositories the team has access to items: $ref: "#/components/schemas/RepositoryInfo" slug: type: string description: Stable team key for URL filters required: - hidden - id - labels - members - membershipCount - name - repoPermissionCount - repositories - slug TeamRef: type: object description: "A team, by name" properties: id: type: integer format: int64 description: Identifier of the team name: type: string description: Name of the team example: Platform required: - id - name TeamSummary: type: object description: Lightweight summary of a team without member/repository details properties: description: type: string description: Description of the team hidden: type: boolean description: Whether the team is hidden from workspace activity htmlUrl: type: string description: URL to the team's page on the git provider id: type: integer format: int64 description: Unique identifier of the team name: type: string description: Name of the team organization: type: string description: Organization the team belongs to parentId: type: integer format: int64 description: "ID of the parent team, if this is a sub-team" privacy: type: string description: Privacy level of the team (SECRET or VISIBLE) enum: - SECRET - VISIBLE required: - hidden - id - name TrendSupport: type: object properties: bundleSize: type: integer format: int32 calendarSpanDays: type: - "null" - integer format: int32 comparablePractices: type: - "null" - integer format: int32 credibilityThreshold: type: number format: double currentOpportunities: type: integer format: int32 eligiblePractices: type: - "null" - integer format: int32 firstOpportunityAt: type: - string - "null" format: date-time lastOpportunityAt: type: - string - "null" format: date-time opportunities: type: integer format: int32 opportunitiesUntilComparable: type: integer format: int32 previousOpportunities: type: integer format: int32 reviewedWork: type: integer format: int32 reviewedWorkKind: type: - string - "null" ropeHalfWidth: type: number format: double standingWork: type: integer format: int32 required: - bundleSize - calendarSpanDays - comparablePractices - credibilityThreshold - currentOpportunities - eligiblePractices - firstOpportunityAt - lastOpportunityAt - opportunities - opportunitiesUntilComparable - previousOpportunities - reviewedWork - reviewedWorkKind - ropeHalfWidth - standingWork TriggerSyncJobRequest: type: object description: Manual sync trigger request body properties: type: type: string description: "RECONCILIATION for a full re-sync, BACKFILL for historical\ \ data" enum: - INITIAL - RECONCILIATION - BACKFILL required: - type UpdateAccountRequest: type: object properties: appRole: type: string UpdateConnectionStatusRequest: type: object description: Request to update a connection's lifecycle status properties: reason: type: string description: Optional human-readable reason recorded on the audit trail state: type: string description: "Target lifecycle state. Admin-settable: ACTIVE, SUSPENDED,\ \ UNINSTALLED." enum: - PENDING - ACTIVE - SUSPENDED - UNINSTALLED required: - state UpdateInstanceLlmSettingsRequest: type: object description: Update instance-wide LLM governance settings (all fields optional) properties: allowWorkspaceConnections: type: boolean description: Whether workspaces may register their own LLM connections allowedEgressHosts: type: string description: Comma/newline-delimited egress host allowlist; blank clears it UpdateLlmBudgetRequest: type: object description: Set or clear a monthly LLM budget cap properties: monthlyBudgetUsd: type: number format: decimal description: "Cap in USD; 0 pauses the affected work immediately, null removes\ \ the cap. The purse it governs is the one the path names, and only that\ \ one: /admin/workspaces/{workspaceSlug}/llm/budget caps spend on shared\ \ (instance) models, /workspaces/{workspaceSlug}/llm/budget caps the workspace's\ \ spend on its own connected provider. The two are never added together." minimum: 0.00 UpdateLlmConnectionRequest: type: object description: Update an instance LLM provider connection (all fields optional) properties: apiKey: type: string description: New API key (write-only; never returned) clearApiKey: type: boolean description: Set true to clear the stored API key clearConnectionPlatform: type: boolean description: Set true to clear the declared connection platform connectionPlatform: type: string description: Admin-declared connection platform enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the connection is enabled UpdateLlmModelPriceRequest: type: object description: Reprice a model; supersedes the current price properties: note: type: string description: "Note; required when the model is free (e.g. self-hosted, no\ \ cost)" maxLength: 500 minLength: 0 per1mCacheReadUsd: type: number format: decimal description: "Cache-read rate per 1M tokens (USD), if applicable" per1mCacheWriteUsd: type: number format: decimal description: "Cache-write rate per 1M tokens (USD), if applicable" per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD); required when the model has a price per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD); required when the model has a price pricingMode: type: string description: PRICED shows the price itself; NO_CHARGE is a deliberate no-cost declaration; UNPRICED shows "No price set" enum: - PRICED - NO_CHARGE - UNPRICED required: - pricingMode UpdateLlmModelRequest: type: object description: Update a model's metadata (all fields optional; pricing and sharing are separate) properties: brand: type: string description: Model brand declared by an admin; null keeps current enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT clearBrand: type: boolean description: Clear the declared model brand clearReasoningEffort: type: boolean description: "True clears the reasoning effort, so the provider's own default\ \ applies" contextWindow: type: integer format: int32 description: Context window in tokens minimum: 1 dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" maxLength: 200 minLength: 0 displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Active toggle (off = existing settings stop working) maxOutputTokens: type: integer format: int32 description: Maximum output tokens minimum: 1 operatedBy: type: string description: Who operates the systems the work is sent to; omit to leave the model undeclared enum: - OWN_ORGANISATION - PROVIDER reasoningEffort: type: string description: Reasoning effort to request; null keeps the current one (see clearReasoningEffort) enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX UpdateLlmModelSharingRequest: type: object description: "Share with: all workspaces, or a selected set" properties: visibility: type: string description: Share with all workspaces (PUBLIC) or only the selected ones (GRANTED) enum: - PUBLIC - GRANTED workspaceIds: type: array description: Workspace ids to share with when visibility is GRANTED; empty or omitted stages the model without workspace access items: type: integer format: int64 required: - visibility UpdateLoginProviderRequest: type: object properties: baseUrl: type: string clientId: type: string clientSecret: type: string description: Omit to leave the existing secret unchanged displayName: type: string enabled: type: boolean scopes: type: string UpdateNotificationPreferences: type: object properties: productFeedback: type: boolean productSurveys: type: boolean researchSurveys: type: boolean surveySummaries: type: boolean workspaceAlerts: type: boolean required: - productFeedback - productSurveys - researchSurveys - surveySummaries - workspaceAlerts UpdateOutlineCollectionStateRequest: type: object description: Transition a mirrored Outline collection to a target mirror state (pause / resume) properties: state: type: string description: Target mirror state enum: - ENABLED - PAUSED required: - state UpdatePracticeGroupRequest: type: object properties: color: type: - string - "null" maxLength: 32 minLength: 0 description: type: - string - "null" maxLength: 2000 minLength: 0 icon: type: - string - "null" maxLength: 64 minLength: 0 name: type: string maxLength: 128 minLength: 0 shownToDevelopers: type: boolean required: - color - description - icon - name - shownToDevelopers UpdatePracticeRequest: type: object properties: definition: $ref: "#/components/schemas/PracticeDefinitionInput" expectedVersionId: type: string pattern: "[1-9][0-9]*" required: - definition - expectedVersionId UpdatePracticeReviewSettingsRequest: type: object description: Update per-workspace practice-review policy. Null fields unchanged; 'reset' clears to inherit. properties: cooldownMinutes: type: integer format: int32 description: Minimum minutes between reviews for the same PR; 0 disables the cooldown maximum: 1440 minimum: 0 defaultFeedbackMode: type: string description: The default feedback mode. Null leaves it unchanged; DEFAULT_FEEDBACK_MODE in reset restores inheritance. enum: - "OFF" - APPROVE_FIRST - AUTOMATIC deliverToMerged: type: boolean description: Deliver feedback to already-merged PRs/MRs deliveryStatus: type: string description: Pause or activate external feedback. Resume never releases work from an older revision. enum: - ACTIVE - PAUSED generatedPaths: type: object additionalProperties: type: array items: type: string description: Patch generated-path patterns per monitored repository. An empty list clears that repository. Null leaves all unchanged. reset: type: array description: Fields to reset back to inherit items: type: string enum: - DELIVER_TO_MERGED - COOLDOWN_MINUTES - REVIEW_SCOPE - DEFAULT_FEEDBACK_MODE uniqueItems: true reviewScope: $ref: "#/components/schemas/WorkspaceReviewScope" description: Replaces repository and person coverage wholesale. Null leaves it unchanged. UpdateRepositorySettingsRequest: type: object description: Request to update repository contribution visibility settings in a workspace properties: hiddenFromContributions: type: boolean description: Whether activity in this repository should be left out of the team's activity required: - hiddenFromContributions UpdateReviewBatchStatusRequest: type: object properties: status: type: string enum: - AWAITING_CONFIRMATION - RUNNING - PAUSED - COMPLETED - CANCELLED required: - status UpdateSilentModeRequest: type: object properties: engaged: type: boolean reason: type: string maxLength: 500 minLength: 0 required: - engaged UpdateSlackChannelConsentRequest: type: object description: Transition a Slack channel to a target consent state properties: consentState: type: string description: Target consent state enum: - PENDING - ACTIVE - PAUSED - REVOKED reason: type: string description: Optional free-text reason recorded in the immutable audit trail maxLength: 2000 minLength: 0 required: - consentState UpdateSlackUserPreferencesRequest: type: object properties: channelMessagesAllowed: type: boolean required: - channelMessagesAllowed UpdateSyncJobRequest: type: object properties: cancelRequested: type: boolean required: - cancelRequested UpdateTeamSettingsRequest: type: object description: Request to update team visibility settings in a workspace properties: hidden: type: boolean description: Whether the team should be hidden from workspace activity required: - hidden UpdateWorkspaceFeaturesRequest: type: object description: Request to turn practice reviews and their triggers on or off. Null fields are left unchanged. properties: practiceReviewAutoTriggerEnabled: type: boolean description: Enable automatic practice reviews triggered by PR events practiceReviewManualTriggerEnabled: type: boolean description: Enable manual practice reviews triggered through a bot command practicesEnabled: type: boolean description: Enable the practice review feature UpdateWorkspaceLlmConnectionRequest: type: object description: Update your AI provider connection (all fields optional) properties: apiKey: type: string description: New API key (write-only; never returned) clearApiKey: type: boolean description: Set true to clear the stored API key clearConnectionPlatform: type: boolean description: Set true to clear the declared connection platform connectionPlatform: type: string description: Admin-declared connection platform enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Whether the connection is active UpdateWorkspaceLlmModelRequest: type: object description: Update a model on your AI provider (all fields optional) properties: brand: type: string description: Model brand declared by an admin; null keeps current enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT clearBrand: type: boolean description: Clear the declared model brand clearReasoningEffort: type: boolean description: "True clears the reasoning effort, so the provider's own default\ \ applies" contextWindow: type: integer format: int32 description: Context window in tokens minimum: 1 dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" maxLength: 200 minLength: 0 displayName: type: string description: Human-readable name maxLength: 128 minLength: 0 enabled: type: boolean description: Active toggle maxOutputTokens: type: integer format: int32 description: Maximum output tokens minimum: 1 operatedBy: type: string description: Who operates the systems the work is sent to; omit to leave the model undeclared enum: - OWN_ORGANISATION - PROVIDER per1mCacheReadUsd: type: number format: decimal description: "Cache-read rate per 1M tokens (USD), if applicable" per1mCacheWriteUsd: type: number format: decimal description: "Cache-write rate per 1M tokens (USD), if applicable" per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD) per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD) priceNote: type: string description: "Note; required when the model is free (e.g. self-hosted, no\ \ cost)" maxLength: 500 minLength: 0 pricingMode: type: string description: "Pricing mode; when given, replaces the price wholesale (see\ \ class docs)" enum: - PRICED - NO_CHARGE - UNPRICED reasoningEffort: type: string description: Reasoning effort to request; null keeps the current one (see clearReasoningEffort) enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX UpdateWorkspacePublicActivityRequest: type: object properties: allowSearchEngines: type: boolean publicActivityEnabled: type: boolean required: - allowSearchEngines - publicActivityEnabled UpdateWorkspaceStatusRequest: type: object description: Request to update the workspace lifecycle status properties: status: type: string description: "Target lifecycle status. PURGED is not a status transition:\ \ purge is irreversible and owner-only, so it lives at DELETE /workspaces/{workspaceSlug}." enum: - ACTIVE - SUSPENDED required: - status UpdateWorkspaceTokenRequest: type: object description: Request to update the workspace's SCM Personal Access Token properties: personalAccessToken: type: string description: SCM Personal Access Token for API access minLength: 1 required: - personalAccessToken UserInfo: type: object description: Information about a user from the git provider properties: avatarUrl: type: string description: URL to the user's avatar image email: type: string description: "Email address of the user, if public" htmlUrl: type: string description: URL to the user's profile on the git provider id: type: integer format: int64 description: Unique identifier of the user login: type: string description: Login/username of the user name: type: string description: Display name of the user required: - avatarUrl - htmlUrl - id - login - name UserSettings: type: object description: User preferences and settings properties: practiceFeedbackDeliveryEnabled: type: boolean description: "Whether new practice-feedback comments may be delivered on\ \ issues, pull requests, and merge requests authored by the user, together\ \ with related Slack reminders" required: - practiceFeedbackDeliveryEnabled UserTeams: type: object properties: email: type: string hidden: type: boolean id: type: integer format: int64 login: type: string name: type: string teams: type: array items: $ref: "#/components/schemas/TeamSummary" uniqueItems: true url: type: string required: - id - login - name - teams - url UserViewAccount: type: object properties: account: $ref: "#/components/schemas/AccountRef" accountId: type: string pattern: "^[1-9][0-9]*$" providerLogin: type: - string - "null" required: - account - accountId - providerLogin Value: type: object properties: label: type: string value: type: string Withheld: type: object properties: itemId: type: string practiceSlug: type: string reason: type: string WithheldScanReportItem: allOf: - type: object properties: item: $ref: "#/components/schemas/ItemRef" itemVersion: type: string practiceName: type: string practiceSlug: type: string reason: type: string status: type: string enum: - WITHHELD required: - item - itemVersion - practiceName - practiceSlug - reason - status WorkItem: type: object description: A pull request or issue properties: author: $ref: "#/components/schemas/UserInfo" description: The author checks: type: string description: "What the checks said about the pull request's current head,\ \ when known" enum: - SUCCESS - FAILURE - PENDING - CANCELLED - NONE - NO_PIPELINE - SKIPPED createdAt: type: string format: date-time description: When it was created htmlUrl: type: string description: Link to the pull request or issue on the provider id: type: integer format: int64 description: Identifier of the pull request or issue isDraft: type: boolean description: Whether the pull request is a draft; false for issues number: type: integer format: int32 description: Number within the repository example: 42 repository: $ref: "#/components/schemas/RepositoryInfo" description: The repository requestedTeams: type: array description: The member's teams the pull request asks for a review; only team review requests list them items: $ref: "#/components/schemas/TeamRef" reviewDecision: type: string description: "The pull request's review decision, when the provider reported\ \ one" enum: - APPROVED - CHANGES_REQUESTED - REVIEW_REQUIRED reviewers: type: array description: "The pull request's reviewers besides its author, where each\ \ review stands; only open work lists them" items: $ref: "#/components/schemas/Reviewer" state: type: string description: Current state enum: - OPEN - CLOSED - MERGED title: type: string description: Title type: type: string description: Whether this is a pull request or an issue enum: - PULL_REQUEST - ISSUE updatedAt: type: string format: date-time description: When it was last updated required: - id - isDraft - number - state - title - type WorkItemList: type: object description: "Pull requests or issues, most recently updated first, up to a\ \ limit" properties: content: type: array description: "The work, most recently updated first" items: $ref: "#/components/schemas/WorkItem" hasMore: type: boolean description: Whether more work exists than the list holds required: - content - hasMore Workspace: type: object description: Complete workspace information including configuration and settings properties: accountLogin: type: string description: Git provider account login associated with this workspace createdAt: type: string format: date-time description: Timestamp when the workspace was created displayName: type: string description: Human-readable name of the workspace gitlabWebhookRegistered: type: boolean description: Whether a GitLab webhook has been auto-registered for this workspace hasPersonalAccessToken: type: boolean description: Whether a Personal Access Token is configured hasSlackToken: type: boolean description: Whether Slack token is configured id: type: integer format: int64 description: Unique identifier of the workspace installationId: type: integer format: int64 description: "GitHub App installation ID, if linked" installationLinkedAt: type: string format: date-time description: Timestamp when the GitHub App installation was linked kind: type: string description: Integration kind backing this workspace (GITHUB or GITLAB) practiceReviewAutoTriggerEnabled: type: boolean description: Whether automatic practice reviews triggered by PR events are enabled practiceReviewManualTriggerEnabled: type: boolean description: Whether manual practice reviews triggered through a bot command are enabled practicesEnabled: type: boolean description: Whether practice reviews are on providerType: type: string description: High-level git provider type for the workspace's SCM connection (null if none bound) enum: - GITHUB - GITLAB - SLACK - OUTLINE publicActivityEnabled: type: boolean description: Whether this workspace has enabled its public activity page serverUrl: type: string description: Custom server URL for self-hosted instances (null for cloud defaults) slackConnectionId: type: integer format: int64 description: "ID of the active Slack connection, if any — addresses PATCH\ \ /connections/{id}/status" status: type: string description: "Current lifecycle status of the workspace (PENDING, ACTIVE,\ \ ARCHIVED)" updatedAt: type: string format: date-time description: Timestamp when the workspace was last updated workspaceAddress: type: string description: Canonical workspace address. Uses the apex path when subdomains are off. workspaceSlug: type: string description: URL-friendly identifier for the workspace example: my-workspace required: - accountLogin - createdAt - displayName - gitlabWebhookRegistered - hasPersonalAccessToken - hasSlackToken - id - practiceReviewAutoTriggerEnabled - practiceReviewManualTriggerEnabled - practicesEnabled - publicActivityEnabled - status - updatedAt - workspaceAddress - workspaceSlug WorkspaceAiModel: type: object description: A model this answer would use here. properties: brand: type: string enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT connectionPlatform: type: string enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY dataHandlingTier: type: string enum: - IN_HOUSE - CLOUD - UNDECLARED name: type: string required: - dataHandlingTier - name WorkspaceAiOption: type: object properties: choice: type: string enum: - NO_AI - IN_HOUSE_ONLY - CLOUD mentorReady: type: boolean models: type: array items: $ref: "#/components/schemas/WorkspaceAiModel" practiceReviewsReady: type: boolean required: - choice - mentorReady - models - practiceReviewsReady WorkspaceListItem: type: object description: Summary information about a workspace for list views properties: accountLogin: type: string description: Git provider account login associated with this workspace createdAt: type: string format: date-time description: Timestamp when the workspace was created displayName: type: string description: Human-readable name of the workspace id: type: integer format: int64 description: Unique identifier of the workspace practicesEnabled: type: boolean description: Whether practice reviews are on providerType: type: string description: "High-level git provider type (GITHUB or GITLAB), or null if\ \ no SCM connection bound" enum: - GITHUB - GITLAB - SLACK - OUTLINE publishesPublicActivity: type: boolean description: "Whether the public activity page is live: the instance allows\ \ it and the workspace turned it on" status: type: string description: "Current lifecycle status of the workspace (PENDING, ACTIVE,\ \ ARCHIVED)" workspaceAddress: type: string description: Canonical workspace address. Uses the apex path when subdomains are off. workspaceSlug: type: string description: URL-friendly identifier for the workspace example: my-workspace required: - accountLogin - createdAt - displayName - id - practicesEnabled - publishesPublicActivity - status - workspaceAddress - workspaceSlug WorkspaceLlmConnection: type: object description: Your AI provider connection (API key redacted) properties: apiKeyLast4: type: string description: "Last four characters of the stored API key, if any" apiProtocol: type: string description: Wire protocol enum: - openai-completions - openai-responses - openai-decisions - openai-embeddings - cohere-rerank example: openai-responses authMode: type: string description: Credential shape enum: - BEARER - API_KEY baseUrl: type: string description: Provider base URL connectionPlatform: type: string description: Admin-declared connection platform enum: - LOGOS - VLLM - OLLAMA - AZURE - AWS_BEDROCK - GOOGLE_VERTEX - OPENAI - GOOGLE_AI_STUDIO - ALIBABA_CLOUD - GROQ - FIREWORKS - TOGETHER_AI - DEEPINFRA - NEBIUS - OPENROUTER - CLOUDFLARE_AI_GATEWAY - VERCEL_AI_GATEWAY createdAt: type: string format: date-time description: Creation timestamp displayName: type: string description: Human-readable name enabled: type: boolean description: Whether the connection is active hasApiKey: type: boolean description: Whether an API key is stored id: type: integer format: int64 description: Connection ID purposes: type: array description: "The purposes a model on this connection can serve, from its\ \ protocol" items: type: string enum: - PRACTICE_REVIEW - MENTOR - PRACTICE_DECISION - PRACTICE_EMBEDDING - PRACTICE_RERANKING slug: type: string description: Unique slug within the workspace example: openai-prod updatedAt: type: string format: date-time description: Last update timestamp required: - apiProtocol - authMode - baseUrl - createdAt - displayName - enabled - hasApiKey - id - purposes - slug WorkspaceLlmModel: type: object description: A model on your AI provider properties: brand: type: string description: Model brand declared by an admin; display only enum: - OPENAI - ANTHROPIC - GEMINI - GEMMA - META - MISTRAL - QWEN - DEEPSEEK - XAI - COHERE - Z_AI - MOONSHOT connectionDisplayName: type: string description: Owning connection's display name connectionId: type: integer format: int64 description: Owning connection id contextWindow: type: integer format: int32 description: Context window in tokens createdAt: type: string format: date-time description: Creation timestamp currency: type: string description: Currency code dataHandlingNote: type: string description: "Admin-only note: region, agreement, renewal date" dataHandlingTier: type: string description: Data-handling tier derived from the operator; UNDECLARED until it is set enum: - IN_HOUSE - CLOUD - UNDECLARED displayName: type: string description: Human-readable name enabled: type: boolean description: Active toggle id: type: integer format: int64 description: Model id maxOutputTokens: type: integer format: int32 description: Maximum output tokens operatedBy: type: string description: Who operates the systems the work is sent to; null until declared enum: - OWN_ORGANISATION - PROVIDER per1mCacheReadUsd: type: number format: decimal description: Cache-read rate per 1M tokens (USD) per1mCacheWriteUsd: type: number format: decimal description: Cache-write rate per 1M tokens (USD) per1mInputUsd: type: number format: decimal description: Input rate per 1M tokens (USD) per1mOutputUsd: type: number format: decimal description: Output rate per 1M tokens (USD) priceNote: type: string description: Price note pricingMode: type: string description: Pricing mode enum: - PRICED - NO_CHARGE - UNPRICED reasoningEffort: type: string description: "Reasoning effort requested of the model; null sends none,\ \ the provider's default applies" enum: - NONE - MINIMAL - LOW - MEDIUM - HIGH - XHIGH - MAX slug: type: string description: Unique slug within the workspace updatedAt: type: string format: date-time description: Last update timestamp upstreamModelId: type: string description: Upstream provider model id required: - connectionDisplayName - connectionId - createdAt - currency - dataHandlingTier - displayName - enabled - id - pricingMode - slug - upstreamModelId WorkspaceLlmProbeResult: type: object description: Result of testing your AI provider connection properties: message: type: string description: Human-readable diagnostic when not reachable modelCount: type: integer format: int32 description: How many models the provider listed (0 if unreachable) reachable: type: boolean description: Whether the provider answered statusCode: type: integer format: int32 description: "HTTP status returned by the provider, if any" required: - modelCount - reachable WorkspaceLlmSettings: type: object description: The instance LLM policy as it applies to this workspace (read-only) properties: ownProviderAllowed: type: boolean description: Whether this workspace may register its own LLM provider connections required: - ownProviderAllowed WorkspaceLlmUsageReport: type: object description: "One calendar month of a workspace's LLM spend, rolled up from\ \ the usage ledger" properties: byDay: type: array items: $ref: "#/components/schemas/LlmUsageByDay" byJobType: type: array items: $ref: "#/components/schemas/LlmUsageByJobType" byPractice: type: array description: "The decision, embedding and reranking calls of practice scripts,\ \ one entry per practice, most spend first. Their spend is already part\ \ of byJobType. Chat calls of practice scripts are in each review's own\ \ cost and not here." items: $ref: "#/components/schemas/LlmUsageByPractice" fx: $ref: "#/components/schemas/FxRateInfo" description: Display-only conversion when the instance has a display currency. Absent = show USD only. instanceBudgetVerdict: type: string description: "Whether host-funded (shared-model) spend is within its cap,\ \ has reached it, or cannot be confirmed because shared-model rates are\ \ missing or usage measurements are unverified." enum: - WITHIN - EXHAUSTED - UNVERIFIABLE instanceMonthlyBudgetUsd: type: number format: decimal description: Monthly cap in USD on spend the host pays for (shared models); null = uncapped. Set by instance admins only — a workspace admin can see it but not change it. instancePaused: type: boolean description: "Whether work on SHARED models is currently paused for this\ \ workspace. Authoritative — it mirrors the live gate rather than being\ \ derivable from the verdict alone. Always false for a past month, which\ \ cannot pause anything." instanceTotalCostUsd: type: number format: decimal description: "This month's confirmed spend on shared (instance) models,\ \ in USD — the figure instanceMonthlyBudgetUsd compares against. A floor,\ \ not the full total, while unpricedEventCount is non-zero." month: type: string description: "Calendar month (UTC), ISO yyyy-MM" example: 2026-07 ownProviderBudgetVerdict: type: string description: "The same verdict for spend on this workspace's own provider,\ \ against its own cap." enum: - WITHIN - EXHAUSTED - UNVERIFIABLE ownProviderInUse: type: boolean description: "Whether this month has an own-provider purse to show. True\ \ when the month has at least one own-provider call, priced or not, so\ \ a month of confirmed $0.00 calls counts. For the current month, also\ \ true when the workspace has an enabled own-provider model on an enabled\ \ connection, so its admins can set a provider cap before the first call.\ \ The spend and cap fields cannot answer this." ownProviderMonthlyBudgetUsd: type: number format: decimal description: Monthly cap in USD on spend this workspace pays for through its own connected provider; null = uncapped. Set by this workspace's own admins. ownProviderPaused: type: boolean description: Whether work on this workspace's OWN provider is currently paused. ownProviderTotalCostUsd: type: number format: decimal description: "This month's confirmed spend on this workspace's own connected\ \ provider(s), in USD — the figure ownProviderMonthlyBudgetUsd compares\ \ against. Different money from instanceTotalCostUsd: the two are never\ \ added together." practiceScriptTotal: $ref: "#/components/schemas/LlmUsagePracticeScriptTotal" description: "The byPractice entries in total, read from the ledger." unpricedEventCount: type: integer format: int64 description: "Runs this month (job attempts and mentor turns, either purse)\ \ with at least one ledger row whose cost is unavailable because a rate\ \ is missing or the measurement is unverified, each counted once. A practice\ \ script row counts toward the run of its review. Those rows are excluded\ \ from both totals above, so a non-zero value means the real spend may\ \ be higher than shown." required: - byDay - byJobType - byPractice - instanceBudgetVerdict - instancePaused - instanceTotalCostUsd - month - ownProviderBudgetVerdict - ownProviderInUse - ownProviderPaused - ownProviderTotalCostUsd - practiceScriptTotal - unpricedEventCount WorkspaceMembership: type: object properties: account: $ref: "#/components/schemas/AccountRef" eligibleForPracticeReview: type: boolean hidden: type: boolean joinedAt: type: string format: date-time leftAt: type: - string - "null" format: date-time reviewSelected: type: boolean role: type: string enum: - OWNER - ADMIN - MEMBER required: - account - eligibleForPracticeReview - hidden - joinedAt - leftAt - reviewSelected - role WorkspaceOnboarding: type: object description: |- One member's view of setup in one workspace. aiChoice is the account's answer, the same in every workspace; aiOptions says what this workspace has set up under each answer, which is what differs between workspaces. properties: aiChoice: type: string enum: - NO_AI - IN_HOUSE_ONLY - CLOUD aiChoiceRequired: type: boolean aiOptions: type: array items: $ref: "#/components/schemas/WorkspaceAiOption" enabled: type: boolean links: type: array items: $ref: "#/components/schemas/WorkspaceOnboardingLink" needsSetup: type: boolean workspaceName: type: string required: - aiChoiceRequired - aiOptions - enabled - links - needsSetup - workspaceName WorkspaceOnboardingLink: type: object properties: available: type: boolean connectionId: type: integer format: int64 displayName: type: string linked: type: boolean providerType: type: string registrationId: type: string required: type: boolean teamName: type: string required: - available - connectionId - displayName - linked - providerType - required WorkspaceOnboardingSettings: type: object description: |- aiChoiceRequired is read on GET and ignored on PUT: the server latches it the first time the setup page is enabled and never clears it. properties: aiChoiceRequired: type: boolean enabled: type: boolean requiredConnectionIds: type: array items: type: integer format: int64 exclusiveMinimum: 0 maxItems: 20 minItems: 0 revision: type: integer format: int64 required: - aiChoiceRequired - enabled - requiredConnectionIds - revision WorkspaceProviders: type: object description: Available workspace creation providers and their configuration properties: creationPolicy: type: string description: Who may create workspaces — ADMIN_ONLY restricts creation to instance admins enum: - ADMIN_ONLY - SELF_SERVICE github: $ref: "#/components/schemas/GitHubProvider" description: "GitHub workspace provider config, null if not available" gitlab: $ref: "#/components/schemas/GitLabProvider" description: "GitLab workspace provider config, null if not available" WorkspaceReviewScope: type: object properties: accountIds: type: array items: type: string pattern: "[1-9][0-9]*" people: type: string enum: - ALL - SELECTED repositories: type: string enum: - ALL - SELECTED selectedRepositories: type: array items: $ref: "#/components/schemas/ReviewScopeRepository" required: - accountIds - people - repositories - selectedRepositories WorkspaceTeamRepositorySettings: type: object description: Repository contribution visibility settings for a specific team within a workspace properties: hiddenFromContributions: type: boolean description: Whether activity in this repository is left out of the team's activity repositoryId: type: integer format: int64 description: The repository ID these settings apply to teamId: type: integer format: int64 description: The team ID these settings apply to workspaceId: type: integer format: int64 description: The workspace ID these settings belong to required: - hiddenFromContributions - repositoryId - teamId - workspaceId WorkspaceTeamSettings: type: object description: Team visibility settings for a specific workspace properties: hidden: type: boolean description: Whether the team is hidden from workspace activity teamId: type: integer format: int64 description: The team ID these settings apply to workspaceId: type: integer format: int64 description: The workspace ID these settings belong to required: - hidden - teamId - workspaceId WorsenedBasis: allOf: - $ref: "#/components/schemas/ClaimBasis" - type: object properties: base: type: integer format: int32 explanation: type: string head: type: integer format: int32 securitySchemes: bearerAuth: bearerFormat: JWT description: Hephaestus-native JWT bearer authentication. The SPA normally authenticates through the `__Host-HEPHAESTUS_AT` session cookie. This scheme documents the equivalent bearer token. scheme: bearer type: http workerBearer: bearerFormat: JWT description: "Worker credential on the private sandbox gateway connector. Bound\ \ to the worker, workspace, job and attempt, with the required proxy scope.\ \ Browser cookies and app-admin authority do not authorize it." scheme: bearer type: http