{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://xeopulse.app/schemas/request.schema.json","type":"object","required":["market","problem","evidenceWindow","tier","velocity","density","observations"],"properties":{"market":{"type":"string","minLength":2,"maxLength":120,"pattern":"^\\S(?:[\\s\\S]*\\S)?$"},"problem":{"type":"string","minLength":10,"maxLength":500,"pattern":"^\\S(?:[\\s\\S]*\\S)?$"},"evidenceWindow":{"enum":["30","90","180"]},"tier":{"enum":["pain","workaround","migration"]},"velocity":{"enum":["rising","steady","declining","unknown"]},"density":{"enum":["low","medium","high","unknown"]},"observations":{"type":"array","minItems":3,"maxItems":10,"items":{"type":"object","required":["sourceUrl","observedDate","excerpt","sourceType","strength","position"],"properties":{"sourceUrl":{"type":"string","format":"uri","pattern":"^[hH][tT][tT][pP][sS]?://(?![^/?#]*@)(?![^/?#]*%)(?![^/?#]*:)(?!\\[)(?![^/?#]*\\.\\.)(?!0[xX][0-9A-Fa-f]+(?:[./?#]|$))(?![^/?#]*\\.0[xX][0-9A-Fa-f]+(?:[./?#]|$))(?=[^/?#:]*[A-Za-z\\u0080-\\uFFFF])(?=[^/?#:]+\\.[^/?#:]+(?:[/?#]|$))(?!(?:[lL][oO][cC][aA][lL][hH][oO][sS][tT]|[^/?#:]+\\.(?:[lL][oO][cC][aA][lL][hH][oO][sS][tT]|[lL][oO][cC][aA][lL]|[iI][nN][tT][eE][rR][nN][aA][lL]|[lL][aA][nN]))(?:[/?#]|$)).+","maxLength":500,"description":"Public HTTP(S) URL with a DNS host and no credentials or explicit port; IP literals, encoded hosts, local names, empty labels and private-network suffixes are rejected. Runtime performs final URL normalization and validation."},"observedDate":{"type":"string","format":"date","description":"Must not be in the future or outside evidenceWindow."},"excerpt":{"type":"string","minLength":8,"maxLength":500,"pattern":"^\\S(?:[\\s\\S]*\\S)?$"},"sourceType":{"enum":["forum","review","search","marketplace","other"]},"strength":{"enum":[1,2,3]},"position":{"enum":["supporting","contradicting"]}},"additionalProperties":false}}},"additionalProperties":false}