{
  "$defs": {
    "google.protobuf.Timestamp": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "format": "date-time",
      "title": "Timestamp",
      "type": "string"
    },
    "synq.entities.v1.AirflowDagIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "dag_id": {
          "description": "Airflow dag_id that identifies the DAG",
          "type": "string"
        },
        "integration_id": {
          "description": "Coalesce Quality integration_id that identifies the Airflow instance",
          "type": "string"
        }
      },
      "required": [
        "integration_id",
        "dag_id"
      ],
      "title": "Airflow Dag Identifier",
      "type": "object"
    },
    "synq.entities.v1.AirflowTaskIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "dag_id": {
          "description": "Airflow dag_id that identifies the DAG",
          "type": "string"
        },
        "integration_id": {
          "description": "Coalesce Quality integration_id that identifies the Airflow instance",
          "type": "string"
        },
        "task_id": {
          "description": "Airflow task_id that identifies the task within the DAG",
          "type": "string"
        }
      },
      "required": [
        "integration_id",
        "dag_id",
        "task_id"
      ],
      "title": "Airflow Task Identifier",
      "type": "object"
    },
    "synq.entities.v1.AthenaTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "catalog": {
          "description": "Glue Data Catalog name. Almost always \"AwsDataCatalog\" \u2014 the default\n catalog for Athena unless the customer registered a federated catalog.",
          "type": "string"
        },
        "database": {
          "description": "Glue database (the namespace users typically filter on).",
          "type": "string"
        },
        "instance": {
          "description": "AWS account and region the Athena workgroup runs in, formatted as\n \"<account-id>.<region>\" (e.g. \"123456789012.eu-west-1\"). Auto-derived\n from sts:GetCallerIdentity at integration setup time.",
          "type": "string"
        },
        "table": {
          "description": "Glue table or view name.",
          "type": "string"
        }
      },
      "required": [
        "instance",
        "catalog",
        "database",
        "table"
      ],
      "title": "Athena Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.BigqueryTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "dataset": {
          "description": "BigQuery dataset id",
          "type": "string"
        },
        "project": {
          "description": "BigQuery project",
          "type": "string"
        },
        "table": {
          "description": "BigQuery table name",
          "type": "string"
        }
      },
      "required": [
        "project",
        "dataset",
        "table"
      ],
      "title": "Bigquery Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.ClickhouseTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "host": {
          "description": "Clickhouse hostname without port",
          "type": "string"
        },
        "schema": {
          "description": "Clickhouse database",
          "type": "string"
        },
        "table": {
          "description": "Clickhouse table",
          "type": "string"
        }
      },
      "required": [
        "host",
        "schema",
        "table"
      ],
      "title": "Clickhouse Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.CustomIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "id": {
          "description": "Id that identifies the custom entity\n The Id should be unique within the custom entity Identifier.",
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "title": "Custom Identifier",
      "type": "object"
    },
    "synq.entities.v1.DatabricksTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "catalog": {
          "description": "Databricks catalog",
          "type": "string"
        },
        "schema": {
          "description": "Databricks schema",
          "type": "string"
        },
        "table": {
          "description": "Databricks table or view",
          "type": "string"
        },
        "workspace": {
          "description": "URL of Databricks workspace",
          "type": "string"
        }
      },
      "required": [
        "workspace",
        "catalog",
        "schema",
        "table"
      ],
      "title": "Databricks Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.DataproductIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "id": {
          "description": "Dataproduct id that identifies the Dataproduct",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "title": "Dataproduct Identifier",
      "type": "object"
    },
    "synq.entities.v1.DbtCloudNodeIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "account_id": {
          "default": "",
          "description": "Your dbt Cloud account id",
          "type": "string"
        },
        "node_id": {
          "description": "Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)",
          "type": "string"
        },
        "project_id": {
          "description": "Your dbt Cloud project id",
          "type": "string"
        }
      },
      "required": [
        "project_id",
        "node_id"
      ],
      "title": "Dbt Cloud Node Identifier",
      "type": "object"
    },
    "synq.entities.v1.DbtCoreNodeIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "integration_id": {
          "description": "Opaque identifier of the dbt Core project. Usually the Coalesce Quality\n integration id (a UUID), but may also be the dbt project name from\n manifest.json when the integration is configured to identify assets by\n project name. Treat it as an opaque string, not a UUID.",
          "type": "string"
        },
        "node_id": {
          "description": "Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)",
          "type": "string"
        }
      },
      "required": [
        "integration_id",
        "node_id"
      ],
      "title": "Dbt Core Node Identifier",
      "type": "object"
    },
    "synq.entities.v1.FabricTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Microsoft Fabric warehouse/lakehouse table identifier. Fabric is\n workspace-scoped with cross-database three-part [database].[schema].[table]\n T-SQL names.",
      "properties": {
        "database": {
          "description": "Fabric warehouse / lakehouse (database).",
          "type": "string"
        },
        "instance": {
          "description": "Workspace SQL analytics endpoint host, e.g.\n \"<workspace-id>.datawarehouse.fabric.microsoft.com\".",
          "type": "string"
        },
        "schema": {
          "description": "Schema within the database.",
          "type": "string"
        },
        "table": {
          "description": "Table or view name.",
          "type": "string"
        },
        "tenant_id": {
          "default": "",
          "description": "Entra (Azure AD) tenant GUID, decoded from the endpoint host in `instance`.\n Optional and informational, like workspace_id.",
          "type": "string"
        },
        "workspace_id": {
          "default": "",
          "description": "Fabric workspace GUID, decoded from the endpoint host in `instance`.\n Optional and informational: the table is addressed by\n instance/database/schema/table, so leave it empty if you don't have it \u2014\n it does not affect how the identifier resolves.",
          "type": "string"
        }
      },
      "required": [
        "instance",
        "database",
        "schema",
        "table"
      ],
      "title": "Fabric Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.Identifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Identifier is a unique reference to an entity in Coalesce Quality system. Entity identifiers\n are designed to closely mimic identifiers used by data platforms and tools. To construct\n an identifier, you need to know the kind of the entity and the ids that you would normally\n use to identify it in the data platform or tool. For example, to identify a table in BigQuery,\n you would need to know the project, dataset, and table names.",
      "properties": {
        "airflow_dag": {
          "$ref": "#/$defs/synq.entities.v1.AirflowDagIdentifier",
          "description": "Airflow DAG identifier"
        },
        "airflow_task": {
          "$ref": "#/$defs/synq.entities.v1.AirflowTaskIdentifier",
          "description": "Airflow task identifier within a given DAG"
        },
        "athena_table": {
          "$ref": "#/$defs/synq.entities.v1.AthenaTableIdentifier",
          "description": "Amazon Athena (Glue) table identifier"
        },
        "bigquery_table": {
          "$ref": "#/$defs/synq.entities.v1.BigqueryTableIdentifier",
          "description": "BigQuery table identifier"
        },
        "clickhouse_table": {
          "$ref": "#/$defs/synq.entities.v1.ClickhouseTableIdentifier",
          "description": "Clickhouse table identifier"
        },
        "custom": {
          "$ref": "#/$defs/synq.entities.v1.CustomIdentifier",
          "description": "Custom identifier to be used with all custom created entities"
        },
        "databricks_table": {
          "$ref": "#/$defs/synq.entities.v1.DatabricksTableIdentifier",
          "description": "Databricks table identifier"
        },
        "dataproduct": {
          "$ref": "#/$defs/synq.entities.v1.DataproductIdentifier",
          "description": "Dataproduct identifier"
        },
        "dbt_cloud_node": {
          "$ref": "#/$defs/synq.entities.v1.DbtCloudNodeIdentifier",
          "description": "Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Cloud project"
        },
        "dbt_core_node": {
          "$ref": "#/$defs/synq.entities.v1.DbtCoreNodeIdentifier",
          "description": "Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Core project"
        },
        "fabric_table": {
          "$ref": "#/$defs/synq.entities.v1.FabricTableIdentifier",
          "description": "Microsoft Fabric table identifier"
        },
        "monitor": {
          "$ref": "#/$defs/synq.entities.v1.MonitorIdentifier",
          "description": "Monitor identifier"
        },
        "mssql_table": {
          "$ref": "#/$defs/synq.entities.v1.MssqlTableIdentifier",
          "description": "SQL Server table identifier"
        },
        "mysql_table": {
          "$ref": "#/$defs/synq.entities.v1.MysqlTableIdentifier",
          "description": "Mysql table identifier"
        },
        "oracle_table": {
          "$ref": "#/$defs/synq.entities.v1.OracleTableIdentifier",
          "description": "Oracle table identifier"
        },
        "postgres_table": {
          "$ref": "#/$defs/synq.entities.v1.PostgresTableIdentifier",
          "description": "Postgres table identifier"
        },
        "redshift_table": {
          "$ref": "#/$defs/synq.entities.v1.RedshiftTableIdentifier",
          "description": "Redshift table identifier"
        },
        "saved_view": {
          "$ref": "#/$defs/synq.entities.v1.SavedViewIdentifier",
          "description": "Saved view identifier"
        },
        "snowflake_table": {
          "$ref": "#/$defs/synq.entities.v1.SnowflakeTableIdentifier",
          "description": "Snowflake table identifier"
        },
        "sql_mesh_audit": {
          "$ref": "#/$defs/synq.entities.v1.SqlMeshAuditIdentifier",
          "description": "SQLMesh Audit identifier"
        },
        "sql_mesh_model": {
          "$ref": "#/$defs/synq.entities.v1.SqlMeshModelIdentifier",
          "description": "SQLMesh Model identifier"
        },
        "synq_path": {
          "$ref": "#/$defs/synq.entities.v1.SynqPathIdentifier",
          "description": "SynqPath identifier"
        },
        "trino_table": {
          "$ref": "#/$defs/synq.entities.v1.TrinoTableIdentifier",
          "description": "Trino table identifier"
        }
      },
      "title": "Identifier",
      "type": "object"
    },
    "synq.entities.v1.MonitorIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "integration_id": {
          "description": "Coalesce Quality integration_id of the monitored identifier",
          "type": "string"
        },
        "monitor_id": {
          "description": "Identifier of the monitor",
          "type": "string"
        },
        "monitored_id": {
          "$ref": "#/$defs/synq.entities.v1.Identifier",
          "description": "Identifier of the monitored entity"
        },
        "segment": {
          "description": "Optional monitor segmentation identifier",
          "type": "string"
        }
      },
      "required": [
        "monitored_id",
        "monitor_id"
      ],
      "title": "Monitor Identifier",
      "type": "object"
    },
    "synq.entities.v1.MssqlTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "database": {
          "description": "SQL Server database",
          "type": "string"
        },
        "host": {
          "description": "Hostname of the SQL Server instance",
          "type": "string"
        },
        "schema": {
          "description": "SQL Server schema (e.g. \"dbo\")",
          "type": "string"
        },
        "table": {
          "description": "SQL Server table or view",
          "type": "string"
        }
      },
      "required": [
        "host",
        "database",
        "schema",
        "table"
      ],
      "title": "Mssql Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.MysqlTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "host": {
          "description": "Mysql hostname without port",
          "type": "string"
        },
        "schema": {
          "description": "Mysql database",
          "type": "string"
        },
        "table": {
          "description": "Mysql table",
          "type": "string"
        }
      },
      "required": [
        "host",
        "schema",
        "table"
      ],
      "title": "Mysql Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.OracleTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "host": {
          "description": "Hostname of the Oracle instance",
          "type": "string"
        },
        "schema": {
          "description": "Oracle schema (= owning user)",
          "type": "string"
        },
        "service_name": {
          "description": "Oracle service name (PDB)",
          "type": "string"
        },
        "table": {
          "description": "Oracle table or view",
          "type": "string"
        }
      },
      "required": [
        "host",
        "service_name",
        "schema",
        "table"
      ],
      "title": "Oracle Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.PostgresTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "database": {
          "description": "Postgres database",
          "type": "string"
        },
        "host": {
          "description": "Postgres hostname without port",
          "type": "string"
        },
        "schema": {
          "description": "Postgres schema",
          "type": "string"
        },
        "table": {
          "description": "Postgres table",
          "type": "string"
        }
      },
      "required": [
        "host",
        "database",
        "schema",
        "table"
      ],
      "title": "Postgres Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.RedshiftTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "cluster": {
          "default": "",
          "description": "Redshift cluster",
          "type": "string"
        },
        "database": {
          "description": "Redshift database",
          "type": "string"
        },
        "schema": {
          "description": "Redshift schema",
          "type": "string"
        },
        "table": {
          "description": "Redshift table",
          "type": "string"
        }
      },
      "required": [
        "database",
        "schema",
        "table"
      ],
      "title": "Redshift Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.SavedViewIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "id": {
          "description": "Saved view id (client-supplied UUID) that identifies the saved view",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        }
      },
      "required": [
        "id"
      ],
      "title": "Saved View Identifier",
      "type": "object"
    },
    "synq.entities.v1.SnowflakeTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "account": {
          "description": "Snowflake account",
          "type": "string"
        },
        "database": {
          "description": "Snowflake database",
          "type": "string"
        },
        "schema": {
          "description": "Snowflake schema",
          "type": "string"
        },
        "table": {
          "description": "Snowflake table",
          "type": "string"
        }
      },
      "required": [
        "account",
        "database",
        "schema",
        "table"
      ],
      "title": "Snowflake Table Identifier",
      "type": "object"
    },
    "synq.entities.v1.SqlMeshAuditIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "audit_id": {
          "description": "Identifier of the audit",
          "type": "string"
        },
        "fqn": {
          "description": "SQLMesh model fully qualified name",
          "type": "string"
        },
        "integration_id": {
          "description": "Coalesce Quality integration_id that identifies the dbt Core project",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        }
      },
      "required": [
        "integration_id",
        "fqn",
        "audit_id"
      ],
      "title": "Sql Mesh Audit Identifier",
      "type": "object"
    },
    "synq.entities.v1.SqlMeshModelIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "fqn": {
          "description": "SQLMesh model fully qualified name",
          "type": "string"
        },
        "integration_id": {
          "description": "Coalesce Quality integration_id that identifies the dbt Core project",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        }
      },
      "required": [
        "integration_id",
        "fqn"
      ],
      "title": "Sql Mesh Model Identifier",
      "type": "object"
    },
    "synq.entities.v1.SynqPathIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "path": {
          "description": "Coalesce Quality path that identifies the Coalesce Quality entity, needs to be one of supported paths",
          "type": "string"
        }
      },
      "required": [
        "path"
      ],
      "title": "Synq Path Identifier",
      "type": "object"
    },
    "synq.entities.v1.TrinoTableIdentifier": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "catalog": {
          "description": "Trino catalog",
          "type": "string"
        },
        "host": {
          "description": "Hostname of the Trino instance",
          "type": "string"
        },
        "schema": {
          "description": "Trino schema",
          "type": "string"
        },
        "table": {
          "description": "Trino table or view",
          "type": "string"
        }
      },
      "required": [
        "host",
        "catalog",
        "schema",
        "table"
      ],
      "title": "Trino Table Identifier",
      "type": "object"
    },
    "synq.issues.actor.v1.Actor": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Producers should populate:\n   1. `name` \u2014 human-readable display label, derived from\n      `synq.auth.iam.v1.IamResponse.user_name` when available, falling back\n      to `user_email`. Avoid generic placeholders (\"MCP\", \"API\"); readers\n      treat those as \"no identity resolved\" and fall back to impersonal copy.\n   2. `user` \u2014 the strongest identifier the caller can prove. For human\n      callers, set `email` from `IamResponse.user_email` so the server can\n      resolve the caller back to a workspace user.\n   3. `via` \u2014 entry-point label for the channel through which the request\n      arrived (e.g. VIA_MCP for the MCP server), regardless of who the\n      caller is.",
      "properties": {
        "email": {
          "$ref": "#/$defs/synq.issues.actor.v1.EmailUser"
        },
        "name": {
          "minLength": 1,
          "type": "string"
        },
        "pagerduty": {
          "$ref": "#/$defs/synq.issues.actor.v1.PagerdutyUser"
        },
        "slack": {
          "$ref": "#/$defs/synq.issues.actor.v1.SlackUser"
        },
        "via": {
          "anyOf": [
            {
              "pattern": "^VIA_UNSPECIFIED$",
              "type": "string"
            },
            {
              "enum": [
                "VIA_API",
                "VIA_MCP",
                "VIA_SLACK",
                "VIA_PAGERDUTY"
              ],
              "type": "string"
            },
            {
              "maximum": 2147483647,
              "minimum": -2147483648,
              "type": "integer"
            }
          ],
          "default": 0,
          "title": "Via"
        }
      },
      "required": [
        "name"
      ],
      "title": "Actor identifies who performed a write \u2014 set by the calling client and\n carried end-to-end through the public API into stored audit trails (issue\n status changes, comments, incident assignments) and rendered downstream\n (e.g. Slack/MSTeams/email alerts).",
      "type": "object"
    },
    "synq.issues.actor.v1.EmailUser": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "user_email": {
          "format": "email",
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "user_email"
      ],
      "title": "Email User",
      "type": "object"
    },
    "synq.issues.actor.v1.PagerdutyUser": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "user_id": {
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "user_id"
      ],
      "title": "Pagerduty User",
      "type": "object"
    },
    "synq.issues.actor.v1.SlackUser": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "user_id": {
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "user_id"
      ],
      "title": "Slack User",
      "type": "object"
    },
    "synq.issues.commands.v1.IssuesCommand": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Not to be used directly. Use the IssuesService instead when calling via API.",
      "properties": {
        "mark_expected": {
          "$ref": "#/$defs/synq.issues.issues.v1.MarkExpectedRequest"
        },
        "mark_fixed": {
          "$ref": "#/$defs/synq.issues.issues.v1.MarkFixedRequest"
        },
        "mark_investigating": {
          "$ref": "#/$defs/synq.issues.issues.v1.MarkInvestigatingRequest"
        },
        "mark_no_action_needed": {
          "$ref": "#/$defs/synq.issues.issues.v1.MarkNoActionNeededRequest"
        },
        "post_comment": {
          "$ref": "#/$defs/synq.issues.issues.v1.PostCommentRequest"
        },
        "workspace": {
          "type": "string"
        }
      },
      "required": [
        "workspace"
      ],
      "title": "Issues Command",
      "type": "object"
    },
    "synq.issues.issues.v1.MarkExpectedRequest": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Actor marking the issue as expected."
        },
        "issue_id": {
          "description": "ID of the issue to mark as expected.",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        },
        "require_no_existing_status": {
          "default": false,
          "description": "Ignore status change if the issue already has a status.",
          "type": "boolean"
        },
        "time": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time at which the issue was marked as expected. Defaults to the current time."
        }
      },
      "required": [
        "issue_id",
        "actor",
        "time"
      ],
      "title": "Mark Expected Request",
      "type": "object"
    },
    "synq.issues.issues.v1.MarkFixedRequest": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Actor marking the issue as fixed."
        },
        "issue_id": {
          "description": "ID of the issue to mark as fixed.",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        },
        "require_no_existing_status": {
          "default": false,
          "description": "Ignore status change if the issue already has a status.",
          "type": "boolean"
        },
        "time": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time at which the issue was marked as fixed. Defaults to the current time."
        }
      },
      "required": [
        "issue_id",
        "actor",
        "time"
      ],
      "title": "Mark Fixed Request",
      "type": "object"
    },
    "synq.issues.issues.v1.MarkInvestigatingRequest": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Actor marking the issue as investigating."
        },
        "issue_id": {
          "description": "ID of the issue to mark as investigating.",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        },
        "require_no_existing_status": {
          "default": false,
          "description": "Ignore status change if the issue already has a status.",
          "type": "boolean"
        },
        "time": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time at which the issue was marked as investigating. Defaults to the current time."
        }
      },
      "required": [
        "issue_id",
        "actor",
        "time"
      ],
      "title": "Mark Investigating Request",
      "type": "object"
    },
    "synq.issues.issues.v1.MarkNoActionNeededRequest": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Actor marking the issue as no action needed."
        },
        "issue_id": {
          "description": "ID of the issue to mark as no action needed.",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        },
        "require_no_existing_status": {
          "default": false,
          "description": "Ignore status change if the issue already has a status.",
          "type": "boolean"
        },
        "time": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time at which the issue was marked as no action needed. Defaults to the current time."
        }
      },
      "required": [
        "issue_id",
        "actor",
        "time"
      ],
      "title": "Mark No Action Needed Request",
      "type": "object"
    },
    "synq.issues.issues.v1.PostCommentRequest": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Actor posting the comment."
        },
        "comment": {
          "description": "Comment to post.",
          "type": "string"
        },
        "issue_id": {
          "description": "ID of the issue to post a comment on.",
          "minLength": 1,
          "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
          "type": "string"
        },
        "time": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time at which the comment was posted. Defaults to the current time."
        }
      },
      "required": [
        "issue_id",
        "actor",
        "comment",
        "time"
      ],
      "title": "Post Comment Request",
      "type": "object"
    },
    "synq.webhooks.v1.Callback": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "action_name": {
          "default": "",
          "type": "string"
        },
        "issues_command": {
          "$ref": "#/$defs/synq.issues.commands.v1.IssuesCommand"
        },
        "url": {
          "default": "",
          "type": "string"
        }
      },
      "title": "Callback",
      "type": "object"
    },
    "synq.webhooks.v1.Event": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Payload signing: every outgoing request is signed so the receiver can verify\n it originated from Coalesce Quality and was not tampered with or replayed. Two\n headers are sent on every delivery:\n\n   X-Coalesce-Timestamp: <unix seconds when the delivery was signed>\n   X-Coalesce-Signature: v1=<hex-encoded HMAC-SHA256>\n\n The signature is computed as:\n\n   signed_payload = \"{X-Coalesce-Timestamp}.\" + <raw request body bytes>\n   signature      = hex( HMAC_SHA256(key = signing_secret, msg = signed_payload) )\n\n where signing_secret is the per-integration secret shown (read-only) in the\n webhook integration settings. To verify:\n\n   1. Read X-Coalesce-Timestamp and the raw request body.\n   2. Recompute the signature with your copy of the signing secret and compare\n      it against the v1=... value in X-Coalesce-Signature using a constant-time\n      comparison.\n   3. Optionally reject deliveries whose timestamp is outside your tolerance\n      window (retries reuse the original signing timestamp, so allow for the\n      retry backoff window \u2014 up to ~30 minutes).\n\n The v1= prefix identifies the signature scheme; future schemes may add\n additional space-separated values to the header.",
      "properties": {
        "callbacks": {
          "items": {
            "$ref": "#/$defs/synq.webhooks.v1.Callback"
          },
          "type": "array"
        },
        "event_id": {
          "default": "",
          "type": "string"
        },
        "event_time": {
          "$ref": "#/$defs/google.protobuf.Timestamp"
        },
        "event_type": {
          "anyOf": [
            {
              "pattern": "^EVENT_TYPE_UNSPECIFIED$",
              "type": "string"
            },
            {
              "enum": [
                "EVENT_TYPE_PING",
                "EVENT_TYPE_ISSUE_CREATED",
                "EVENT_TYPE_ISSUE_UPDATED",
                "EVENT_TYPE_ISSUE_STATUS_UPDATED",
                "EVENT_TYPE_ISSUE_CLOSED",
                "EVENT_TYPE_INCIDENT_OPEN",
                "EVENT_TYPE_INCIDENT_CLOSED",
                "EVENT_TYPE_INCIDENT_CANCELLED"
              ],
              "type": "string"
            },
            {
              "maximum": 2147483647,
              "minimum": -2147483648,
              "type": "integer"
            }
          ],
          "default": 0,
          "title": "Event Type"
        },
        "incident_cancelled": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentCancelled"
        },
        "incident_closed": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentClosed"
        },
        "incident_open": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentOpen"
        },
        "issue_closed": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueClosed"
        },
        "issue_created": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueCreated"
        },
        "issue_status_updated": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueStatusUpdated"
        },
        "issue_updated": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueUpdated"
        },
        "ping": {
          "$ref": "#/$defs/synq.webhooks.v1.Ping"
        },
        "workspace": {
          "default": "",
          "type": "string"
        }
      },
      "title": "A webhook event delivered to a customer-configured endpoint.",
      "type": "object"
    },
    "synq.webhooks.v1.IncidentCancelled": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "incident": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentSummary"
        }
      },
      "title": "Incident Cancelled",
      "type": "object"
    },
    "synq.webhooks.v1.IncidentClosed": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "incident": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentSummary"
        }
      },
      "title": "Incident Closed",
      "type": "object"
    },
    "synq.webhooks.v1.IncidentOpen": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "incident": {
          "$ref": "#/$defs/synq.webhooks.v1.IncidentSummary"
        }
      },
      "title": "Incident Open",
      "type": "object"
    },
    "synq.webhooks.v1.IncidentSummary": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "description": {
          "default": "",
          "type": "string"
        },
        "description_html": {
          "default": "",
          "type": "string"
        },
        "ended_at": {
          "$ref": "#/$defs/google.protobuf.Timestamp"
        },
        "incident_id": {
          "default": "",
          "type": "string"
        },
        "incident_url": {
          "default": "",
          "type": "string"
        },
        "started_at": {
          "$ref": "#/$defs/google.protobuf.Timestamp"
        },
        "title": {
          "default": "",
          "type": "string"
        }
      },
      "title": "Incident Summary",
      "type": "object"
    },
    "synq.webhooks.v1.IssueClosed": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "issue": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueSummary"
        }
      },
      "title": "Issue Closed",
      "type": "object"
    },
    "synq.webhooks.v1.IssueCreated": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "issue": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueSummary"
        }
      },
      "title": "Issue Created",
      "type": "object"
    },
    "synq.webhooks.v1.IssueStatusUpdated": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "issue": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueSummary"
        }
      },
      "title": "Issue Status Updated",
      "type": "object"
    },
    "synq.webhooks.v1.IssueSummary.IssueEntity": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "entity_url": {
          "default": "",
          "type": "string"
        },
        "folder": {
          "type": "string"
        },
        "identifier": {
          "$ref": "#/$defs/synq.entities.v1.Identifier"
        },
        "name": {
          "default": "",
          "type": "string"
        },
        "type_name": {
          "default": "",
          "type": "string"
        }
      },
      "title": "Issue Entity",
      "type": "object"
    },
    "synq.webhooks.v1.IssueSummary.Owner": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "An owner (person or team) responsible for an entity, as assigned in\n Coalesce Quality (natively or synced from a catalog).",
      "properties": {
        "id": {
          "default": "",
          "description": "Identifier of the owner within the workspace. Matches the id on the\n Owners API, so callers can fetch the full owner record (contacts,\n source) from that API.",
          "type": "string"
        },
        "title": {
          "default": "",
          "description": "Display name of the owner, e.g. a team or person name.",
          "type": "string"
        },
        "url": {
          "default": "",
          "description": "Deep link to the owner in the Coalesce Quality app.",
          "type": "string"
        }
      },
      "title": "Owner",
      "type": "object"
    },
    "synq.webhooks.v1.IssueSummary": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "description": {
          "default": "",
          "description": "Detailed description of the issue. In the Markdown format.",
          "type": "string"
        },
        "description_html": {
          "default": "",
          "description": "Detailed description of the issue. In the HTML format.",
          "type": "string"
        },
        "directly_affected_entities": {
          "description": "Entities directly affected by the issue, not considering downstream ones.",
          "items": {
            "$ref": "#/$defs/synq.webhooks.v1.IssueSummary.IssueEntity"
          },
          "type": "array"
        },
        "ended_at": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time when the issue was closed."
        },
        "issue_group_id": {
          "default": "",
          "type": "string"
        },
        "issue_id": {
          "default": "",
          "type": "string"
        },
        "issue_url": {
          "default": "",
          "type": "string"
        },
        "monitored_entities": {
          "description": "The primary entities being monitored that are associated with this issue,\n for example the dbt model or dbt Cloud job that a failing test is attached to.",
          "items": {
            "$ref": "#/$defs/synq.webhooks.v1.IssueSummary.IssueEntity"
          },
          "type": "array"
        },
        "owners": {
          "description": "Covers only the direct owners of the affected entities, not the owners of\n downstream entities. Empty when the affected entities have no owner\n assigned. Ordered as shown in the app.",
          "items": {
            "$ref": "#/$defs/synq.webhooks.v1.IssueSummary.Owner"
          },
          "title": "Owners of the entities this issue is about.",
          "type": "array"
        },
        "started_at": {
          "$ref": "#/$defs/google.protobuf.Timestamp",
          "description": "Time when the issue was triggered."
        },
        "status": {
          "anyOf": [
            {
              "pattern": "^ISSUE_STATUS_UNSPECIFIED$",
              "type": "string"
            },
            {
              "enum": [
                "ISSUE_STATUS_INVESTIGATING",
                "ISSUE_STATUS_EXPECTED",
                "ISSUE_STATUS_FIXED",
                "ISSUE_STATUS_NO_ACTION_NEEDED"
              ],
              "type": "string"
            },
            {
              "maximum": 2147483647,
              "minimum": -2147483648,
              "type": "integer"
            }
          ],
          "default": 0,
          "title": "Issue Status"
        },
        "status_actor": {
          "$ref": "#/$defs/synq.issues.actor.v1.Actor",
          "description": "Set only when an actor is known: it is populated on `issue_status_updated`\n events and left unset for system-driven transitions with no human actor\n (e.g. a status implied by a monitor run). Consumers must treat it as\n optional and tolerate its absence.\n\n Carries the strongest identity the caller proved \u2014 a Coalesce Quality\n email, Slack user id, or PagerDuty user id \u2014 alongside a display `name`.",
          "title": "The user who set the current status, when the transition was\n human-initiated (e.g. someone pressing Expected / Fixed / No action\n needed / Investigating in the app or via the public API). This is the\n same actor exposed by the Issues API as `Issue.latest_status_actor`, so\n the two feeds can be joined on it."
        },
        "title": {
          "default": "",
          "description": "Summary of the issue, what happened and where.",
          "type": "string"
        },
        "trigger_entity": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueSummary.IssueEntity",
          "description": "Entity which triggered the issue."
        },
        "trigger_message": {
          "default": "",
          "type": "string"
        },
        "trigger_name": {
          "default": "",
          "type": "string"
        },
        "trigger_run_id": {
          "default": "",
          "type": "string"
        }
      },
      "title": "Issue Summary",
      "type": "object"
    },
    "synq.webhooks.v1.IssueUpdated": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "properties": {
        "issue": {
          "$ref": "#/$defs/synq.webhooks.v1.IssueSummary"
        }
      },
      "title": "Issue Updated",
      "type": "object"
    },
    "synq.webhooks.v1.Ping": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": true,
      "description": "Test event sent during a webhook setup.",
      "properties": {
        "message": {
          "default": "",
          "type": "string"
        }
      },
      "title": "Ping",
      "type": "object"
    }
  },
  "$id": "https://schemas.synq.io/webhook/v1/event.schema.json",
  "$ref": "#/$defs/synq.webhooks.v1.Event",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Coalesce Quality Webhook Event",
  "description": "Schema for webhook event payloads that Coalesce Quality POSTs to your endpoint on issue and incident lifecycle events.",
  "x-status": "stable"
}
