node-autotask 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_TOOL_CATALOG.json +2 -2
- package/MCP_TOOL_MANIFEST.md +4 -4
- package/N8N_MCP_MANIFEST.json +2 -2
- package/N8N_MCP_MANIFEST.md +3 -3
- package/capabilities.json +1259 -1259
- package/dist/capabilities.cjs +2 -3
- package/dist/capabilities.js +1 -2
- package/dist/{chunk-UYJ5V262.js → chunk-3VB6N44U.js} +32 -182
- package/dist/{chunk-BZPFDRAE.js → chunk-6KFP5HV3.js} +1258 -1259
- package/dist/chunk-DMMMWO6A.js +0 -0
- package/dist/chunk-FLB2X6O5.cjs +1 -0
- package/dist/{chunk-UDWV4VVD.js → chunk-HWC2WPX2.js} +214 -20
- package/dist/chunk-IDPB4N2Q.cjs +1 -0
- package/dist/{chunk-QJU2N32V.js → chunk-NVJ2PTN3.js} +2 -3
- package/dist/{chunk-53MC2QRQ.cjs → chunk-QUM74WLQ.cjs} +135 -136
- package/dist/{chunk-OYHKIYVR.cjs → chunk-S7VMY5KN.cjs} +422 -572
- package/dist/chunk-UPQIUWOS.js +0 -0
- package/dist/{chunk-LTKMTXUR.cjs → chunk-WTVD2JZN.cjs} +1258 -1259
- package/dist/{chunk-RWLPTU67.cjs → chunk-WTVLHMZA.cjs} +235 -41
- package/dist/{index-ZknpNhtc.d.ts → index-BOyh7S65.d.cts} +8 -8
- package/dist/{index-CfU1JDgS.d.cts → index-DGgMD8aq.d.ts} +8 -8
- package/dist/{index-O2zzIMcQ.d.cts → index-cQ6CRexR.d.cts} +3 -1
- package/dist/{index-O2zzIMcQ.d.ts → index-cQ6CRexR.d.ts} +3 -1
- package/dist/index.cjs +21 -22
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +6 -7
- package/dist/operations/index.cjs +133 -129
- package/dist/operations/index.d.cts +8 -3
- package/dist/operations/index.d.ts +8 -3
- package/dist/operations/index.js +9 -5
- package/dist/pool.cjs +36 -12
- package/dist/pool.d.cts +2 -2
- package/dist/pool.d.ts +2 -2
- package/dist/pool.js +31 -7
- package/dist/resources/index.cjs +5 -6
- package/dist/resources/index.d.cts +2 -2
- package/dist/resources/index.d.ts +2 -2
- package/dist/resources/index.js +4 -5
- package/dist/types/index.cjs +1 -2
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -2
- package/dist/untrusted.cjs +0 -1
- package/dist/untrusted.js +0 -1
- package/docs/API.md +12 -6
- package/package.json +1 -1
- package/dist/capabilities.cjs.map +0 -1
- package/dist/capabilities.js.map +0 -1
- package/dist/chunk-53MC2QRQ.cjs.map +0 -1
- package/dist/chunk-BZPFDRAE.js.map +0 -1
- package/dist/chunk-CXM35TEC.cjs +0 -1
- package/dist/chunk-CXM35TEC.cjs.map +0 -1
- package/dist/chunk-GIVD2CQ3.js +0 -1
- package/dist/chunk-GIVD2CQ3.js.map +0 -1
- package/dist/chunk-LTKMTXUR.cjs.map +0 -1
- package/dist/chunk-MHBMSBTA.js +0 -1
- package/dist/chunk-MHBMSBTA.js.map +0 -1
- package/dist/chunk-NZUFSSIZ.cjs +0 -1
- package/dist/chunk-NZUFSSIZ.cjs.map +0 -1
- package/dist/chunk-OYHKIYVR.cjs.map +0 -1
- package/dist/chunk-QJU2N32V.js.map +0 -1
- package/dist/chunk-RWLPTU67.cjs.map +0 -1
- package/dist/chunk-UDWV4VVD.js.map +0 -1
- package/dist/chunk-UYJ5V262.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/operations/index.cjs.map +0 -1
- package/dist/operations/index.js.map +0 -1
- package/dist/pool.cjs.map +0 -1
- package/dist/pool.js.map +0 -1
- package/dist/resources/index.cjs.map +0 -1
- package/dist/resources/index.js.map +0 -1
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/untrusted.cjs.map +0 -1
- package/dist/untrusted.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/logger.ts","../src/redact.ts","../src/errors.ts","../src/credential-shape.ts","../src/fieldCache.ts","../src/circuit-breaker.ts","../src/cooldown.ts","../src/cache.ts","../src/cache-ttl-tables.ts","../src/resourceNameCache.ts","../src/host-policy.ts","../src/config.ts","../src/utils/index.ts","../src/query.ts","../src/http.ts","../src/relationships.ts","../src/pagination.ts","../src/field-presets.ts","../src/operations/expandResourceNames.ts","../src/operations/types.ts","../src/operations/fieldCatalog.ts","../src/resources/base.ts"],"sourcesContent":["/**\n * Three-header auth (ARCHITECTURE section 9).\n *\n * Header names use the SWAGGER casing — `ApiIntegrationCode` / `UserName` /\n * `Secret` (the n8n node's `APIIntegrationcode` / `Username` spellings work\n * against the API because HTTP header names are case-insensitive per RFC 7230;\n * the SDK does not emit those spellings). `ImpersonationResourceId` is emitted\n * only when configured non-empty. The SDK produces request headers only — no\n * OAuth flow, no cookie auth, no token exchange; `authenticate()` is a probe.\n */\n\n/** The four auth header names, swagger casing (pinned). */\nexport const AUTH_HEADERS = {\n integrationCode: 'ApiIntegrationCode',\n userName: 'UserName',\n secret: 'Secret',\n impersonation: 'ImpersonationResourceId',\n} as const;\n\n/** Trimmed credentials as stored on the resolved config. */\nexport interface ResolvedAuth {\n apiIntegrationCode: string;\n userName: string;\n secret: string;\n /** When set (non-empty), the `ImpersonationResourceId` header is sent on every request. */\n impersonationResourceId?: string;\n}\n\n/**\n * The auth headers for one request: always the 3-header set;\n * `ImpersonationResourceId` only when configured non-empty.\n */\nexport function buildAuthHeaders(cfg: ResolvedAuth): Record<string, string> {\n const headers: Record<string, string> = {\n [AUTH_HEADERS.integrationCode]: cfg.apiIntegrationCode,\n [AUTH_HEADERS.userName]: cfg.userName,\n [AUTH_HEADERS.secret]: cfg.secret,\n };\n if (cfg.impersonationResourceId !== undefined && cfg.impersonationResourceId.length > 0) {\n headers[AUTH_HEADERS.impersonation] = cfg.impersonationResourceId;\n }\n return headers;\n}\n\n/**\n * Merge auth headers into a caller header map. The SDK OWNS the four auth\n * header names: caller entries for those names are overridden, all other\n * caller headers are preserved. Returns a new object (inputs untouched).\n */\nexport function withAuthHeaders(\n headers: Record<string, string> | undefined,\n cfg: ResolvedAuth,\n): Record<string, string> {\n const merged: Record<string, string> = { ...(headers ?? {}) };\n const auth = buildAuthHeaders(cfg);\n const owned = new Set<string>(Object.keys(auth));\n for (const key of Object.keys(merged)) {\n if (owned.has(key)) delete merged[key];\n }\n return { ...merged, ...auth };\n}\n","/**\n * Logger hook + credential redaction (ARCHITECTURE sections 14, 9).\n *\n * The transport logs at `debug` per request (method and path only — never query\n * values, never header values) and at `warn` on retry/429. The redaction set\n * covers the four credential-shaped header names plus `authToken`\n * (name-based, case-insensitive, caller-extensible). `NoopLogger` is the\n * default sink; `Logger` methods are all optional so `console` is assignable.\n */\n\nexport interface Logger {\n debug?(message: string, ...args: unknown[]): void;\n info?(message: string, ...args: unknown[]): void;\n warn?(message: string, ...args: unknown[]): void;\n error?(message: string, ...args: unknown[]): void;\n}\n\n/** Default no-op logger. */\nexport const NoopLogger: Logger = {};\n\n/** Replacement value written over every credential-shaped value. */\nexport const REDACTED = '[REDACTED]';\n\n/**\n * Credential-shaped header names redacted by name (case-insensitive,\n * separator-insensitive). `authToken` included: token responses are credential\n * payloads (ARCHITECTURE section 9).\n */\nexport const CREDENTIAL_HEADER_NAMES: readonly string[] = [\n 'ApiIntegrationCode',\n 'UserName',\n 'Secret',\n 'ImpersonationResourceId',\n 'authToken',\n];\n\n/** Keys are compared lower-cased with `_`/`-` removed, so every spelling of the same name matches. */\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[_-]/g, '');\n}\n\nconst CREDENTIAL_KEY_SET: ReadonlySet<string> = new Set<string>(CREDENTIAL_HEADER_NAMES.map(normalizeKey));\n\n/** True when `name` matches a credential-shaped key (built-in set or `extraSecretKeys`). */\nexport function isCredentialHeaderName(name: string, extraSecretKeys?: readonly string[]): boolean {\n const normalized = normalizeKey(name);\n if (CREDENTIAL_KEY_SET.has(normalized)) return true;\n if (extraSecretKeys === undefined) return false;\n return extraSecretKeys.some((extra) => normalizeKey(extra) === normalized);\n}\n\n/** A plain record: object whose prototype is Object.prototype or null. */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Recursively replace credential-shaped keys with `[REDACTED]`. Returns a copy\n * — the input is never mutated. The one redactor used for audit payloads and\n * log-side data (the transport never interpolates header values into log lines).\n * Class instances (Date, Blob, ...) are opaque and passed through unchanged.\n */\nexport function redactRecord(value: unknown, extraSecretKeys?: readonly string[]): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => redactRecord(item, extraSecretKeys));\n }\n if (isPlainRecord(value)) {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = isCredentialHeaderName(key, extraSecretKeys) ? REDACTED : redactRecord(item, extraSecretKeys);\n }\n return out;\n }\n return value;\n}\n","/**\n * Response-side field redaction (the INV-A1 leak hotfix).\n *\n * The A1 leak audit (.run/reports/leak-audit.md) confirmed the SDK response\n * path is a pass-through: plaintext credential field values (password,\n * secretKey, secret) and personal/business-sensitive data reach every caller.\n * This module is the single transform applied at the two response sites:\n *\n * - the 2xx branch of `HttpClient.request()` (src/http.ts) — the choke point\n * for every JSON response surface (dedicated tools, invoke, compositions);\n * - `errorFromStatus` (src/errors.ts) — the vendor 4xx/5xx body (vendorError\n * + the adopted message), which may echo a request body that carried a\n * secret.\n *\n * Two classes, two behaviors (the A1 design):\n *\n * - SECRET (always redacted, NO opt-out): the pinned exact vendor-casing key\n * set `password` / `secretKey` / `secret`. The A1 census proves these 3\n * names are secret-only across all 787 swagger definitions (17,167 leaf\n * fields), so name-based matching is safe — exact case-sensitive keys, no\n * regex. The SDK is the only permission boundary (the vendor API has no\n * read-only key), so credential values never cross the SDK boundary in a\n * response.\n * - PII + CONFIDENTIAL (redacted by DEFAULT, opt-out via\n * `redactPersonalData: false`): the pinned name sets from the A1 artifacts\n * (41 personal + 12 confidential, exact vendor casing).\n *\n * EXEMPT: `authToken` (AuthTokenResultModel, GET /V1.0/Authenticate) — the\n * endpoint's purpose is token issuance; it is in no pinned set and is never\n * redacted (pinned by test).\n *\n * RESPONSE-ONLY by design: request bodies are NEVER redacted (password /\n * secretKey legitimately travel IN create/patch requests; the G10b\n * request-body-audit redaction in utils/index.ts is a separate mechanism and\n * is untouched). The transform redacts a key wherever it appears in the\n * parsed body (deep — object values, arrays of items, nested models),\n * replaces the VALUE with the existing `REDACTED` marker (src/logger.ts),\n * keeps the key (stable shape), returns a copy, and never mutates the input.\n */\nimport { REDACTED } from './logger.js';\n\n/**\n * The SECRET class — ALWAYS redacted, no opt-out. Pinned exact vendor casing\n * (case-sensitive; the A1 census: each name appears only on secret-bearing\n * models). A pinned set, not a regex — see the module header for why.\n */\nexport const SECRET_RESPONSE_FIELDS: readonly string[] = [\n 'password', // ClientPortalUserModel\n 'secretKey', // the 5 webhook models\n 'secret', // IntegrationVendorInsightModel, IntegrationVendorWidgetModel\n];\n\n/**\n * The PII class — redacted by default, opt-out via `redactPersonalData:\n * false`. The 41 personal-data names from the A1 artifact (pii-refined.json\n * \"personal\"), exact vendor casing as found in the vendored swagger.\n */\nexport const PERSONAL_RESPONSE_FIELDS: readonly string[] = [\n 'additionalAddressInformation',\n 'additionalBillToAddressInformation',\n 'additionalShipToAddressInformation',\n 'address1',\n 'address2',\n 'addressLine',\n 'addressLine1',\n 'alternatePhone',\n 'alternatePhone1',\n 'alternatePhone2',\n 'billingAddress1',\n 'billingAddress2',\n 'billToAdditionalAddressInformation',\n 'billToCity',\n 'billToPostalCode',\n 'billToZipCode',\n 'city',\n 'email',\n 'email2',\n 'email3',\n 'emailAddress',\n 'emailAddress2',\n 'emailAddress3',\n 'extApprovalContactResponse',\n 'fax',\n 'faxNumber',\n 'gender',\n 'homePhone',\n 'mobilePhone',\n 'notificationEmailAddress',\n 'officePhone',\n 'phone',\n 'postalCode',\n 'recipientEmailAddress',\n 'rmmIsMobileDeviceManagementEnrolled',\n 'shipToAddress1',\n 'shipToAddress2',\n 'shipToCity',\n 'shipToPostalCode',\n 'userName',\n 'zipCode',\n];\n\n/**\n * The CONFIDENTIAL class (business/device-sensitive) — redacted by default,\n * opt-out via `redactPersonalData: false`. The 12 names from the A1 artifact\n * (pii-refined.json \"business\"), exact vendor casing (note `taxID`, not\n * `taxId`; `rmmDeviceAuditSNMPContact` with the vendor's SNMP casing).\n */\nexport const CONFIDENTIAL_RESPONSE_FIELDS: readonly string[] = [\n 'domain',\n 'domainExpirationDateTime',\n 'domainLastUpdatedDateTime',\n 'domainRegistrationDateTime',\n 'primaryContact',\n 'rmmDeviceAuditExternalIPAddress',\n 'rmmDeviceAuditIPAddress',\n 'rmmDeviceAuditMacAddress',\n 'rmmDeviceAuditMobileNumber',\n 'rmmDeviceAuditSNMPContact',\n 'taxID',\n 'webAddress',\n];\n\nconst SECRET_SET = new Set<string>(SECRET_RESPONSE_FIELDS);\nconst OPTIONAL_SET = new Set<string>([...PERSONAL_RESPONSE_FIELDS, ...CONFIDENTIAL_RESPONSE_FIELDS]);\n\n/** The redaction policy for one transform run (resolved from AutotaskConfig). */\nexport interface RedactionPolicy {\n /**\n * Redact the PII + CONFIDENTIAL classes. `false` (the `redactPersonalData:\n * false` opt-out) passes those fields through unredacted; the SECRET class\n * is ALWAYS redacted regardless.\n */\n redactPersonalData: boolean;\n}\n\n/** A plain record (prototype Object.prototype or null) — class instances are opaque. */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Whether a field NAME is redacted under the policy (the SAME key-name sets\n * the response transform uses: SECRET always; PII + CONFIDENTIAL when\n * `redactPersonalData` is on). Exact vendor casing, case-sensitive.\n */\nexport function isRedactedFieldName(name: string, policy: RedactionPolicy): boolean {\n return SECRET_SET.has(name) || (policy.redactPersonalData && OPTIONAL_SET.has(name));\n}\n\n/**\n * Deep-redact the pinned response field names. Returns a copy (the input is\n * never mutated); the value of every key in a pinned set is replaced with the\n * `REDACTED` marker ('[REDACTED]'), the key itself is kept (stable shape).\n * Keys are matched by exact vendor casing (case-sensitive); scalars, null,\n * class instances and empty containers pass through unchanged.\n */\nexport function redactResponseBody(value: unknown, policy: RedactionPolicy): unknown {\n const personal = policy.redactPersonalData;\n if (Array.isArray(value)) {\n return value.map((entry) => redactResponseBody(entry, policy));\n }\n if (!isPlainRecord(value)) return value;\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const pinned = SECRET_SET.has(key) || (personal && OPTIONAL_SET.has(key));\n out[key] = pinned ? REDACTED : redactResponseBody(entry, policy);\n }\n return out;\n}\n","import { redactResponseBody } from './redact.js';\n\n/**\n * AutotaskError hierarchy (ARCHITECTURE section 10).\n *\n * Every error carries the structured contract: `code` (stable SCREAMING_SNAKE\n * machine code), `category`, `retryable`, plus `operation`, `httpStatus`,\n * `vendorError` (the vendor payload under a documented key, deep-redacted —\n * the INV-A1 hotfix), `resourceIds`,\n * `suggestedAction` (deterministic next step only), `correlationId` and `url`.\n *\n * `item: null` on a single GET (HTTP 200) is a NOT FOUND, not a success — the\n * vendor's not-found signal (G1 envelope.md). The vendor documents no error\n * bodies; the shape `{ errors: [{ message, field?, code? }] }` is pinned from\n * the node's errorHandler and parsed defensively here.\n */\n\nexport type ErrorCategory =\n | 'auth'\n | 'not_found'\n | 'validation'\n | 'conflict'\n | 'rate_limit'\n | 'server'\n | 'network'\n | 'timeout'\n | 'resolution'\n | 'policy';\n\nexport interface AutotaskErrorOptions {\n code?: string;\n category?: ErrorCategory;\n operation?: string;\n httpStatus?: number;\n vendorError?: unknown;\n resourceIds?: (number | string)[];\n suggestedAction?: string;\n correlationId?: string;\n retryable?: boolean;\n url?: string;\n /**\n * The structured, deterministic extras that ride on the error WITHOUT\n * changing its contract: issue #9 — the recovery refusals' payload\n * (`{ resource, reason/note, ... }` on DELETE_BOUNDARY /\n * MARKER_UNSAFE_ID / RECOVERY_TRUNCATED); issue #14 — `emptyReason`\n * (the typed reason a miss / drift carries — { kind, note, authority,\n * remedy }) and `pointerNote` (the known-unusable-op pointer sentence).\n * Additive only — the status, code, message and retryability are never\n * derived from it.\n */\n details?: Record<string, unknown>;\n}\n\n/** A plain object record (prototype Object.prototype or null). */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport class AutotaskError extends Error {\n code: string;\n category: ErrorCategory;\n operation?: string;\n httpStatus?: number;\n vendorError?: unknown;\n resourceIds?: (number | string)[];\n suggestedAction?: string;\n correlationId?: string;\n retryable: boolean;\n url?: string;\n /** Issue #9/#14: the additive structured extras (recovery refusal payload; emptyReason / pointerNote) — never changes the error contract. */\n details?: Record<string, unknown>;\n\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message);\n this.name = 'AutotaskError';\n this.code = options.code ?? 'AUTOTASK_ERROR';\n this.category = options.category ?? 'server';\n this.retryable = options.retryable ?? false;\n this.operation = options.operation;\n this.httpStatus = options.httpStatus;\n this.vendorError = options.vendorError;\n this.resourceIds = options.resourceIds;\n this.suggestedAction = options.suggestedAction;\n this.correlationId = options.correlationId;\n this.url = options.url;\n this.details = options.details;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\n\nexport class AutotaskConfigError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'CONFIG_ERROR', category: 'validation', ...options });\n this.name = 'AutotaskConfigError';\n }\n}\n\nexport class AutotaskNetworkError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: 'NETWORK_ERROR',\n category: 'network',\n retryable: true,\n suggestedAction: options.suggestedAction ?? 'Check connectivity to the Autotask zone and retry.',\n ...options,\n });\n this.name = 'AutotaskNetworkError';\n }\n}\n\nexport class AutotaskTimeoutError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: 'TIMEOUT',\n category: 'timeout',\n retryable: true,\n suggestedAction: options.suggestedAction ?? 'Retry, narrow the query, or raise timeoutMs.',\n ...options,\n });\n this.name = 'AutotaskTimeoutError';\n }\n}\n\n/** The caller's `AbortSignal` fired: distinct from a timeout, never retried. */\nexport class AutotaskAbortError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'ABORTED', category: 'network', retryable: false, ...options });\n this.name = 'AutotaskAbortError';\n }\n}\n\n/** A response (or redirect) the transport refuses by policy: non-retryable. */\nexport class ResponseRejectedError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'RESPONSE_REJECTED', category: 'policy', retryable: false, ...options });\n this.name = 'ResponseRejectedError';\n }\n}\n\nexport class BadRequestError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'BAD_REQUEST', category: 'validation', ...options });\n this.name = 'BadRequestError';\n }\n}\n\nexport class UnauthorizedError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'UNAUTHORIZED', category: 'auth', ...options });\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class ForbiddenError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'FORBIDDEN', category: 'auth', ...options });\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NotFoundError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'NOT_FOUND', category: 'not_found', ...options });\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'CONFLICT', category: 'conflict', ...options });\n this.name = 'ConflictError';\n }\n}\n\nexport class UnprocessableEntityError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'VALIDATION_FAILED', category: 'validation', ...options });\n this.name = 'UnprocessableEntityError';\n }\n}\n\nexport class RateLimitError extends AutotaskError {\n /** Seconds the server asked the client to wait (`Retry-After`), when present. */\n retryAfter?: number;\n /** True when the call was refused locally (the tenant cooldown gate) and never sent. */\n notSent?: boolean;\n\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'RATE_LIMITED', category: 'rate_limit', retryable: true, ...options });\n this.name = 'RateLimitError';\n }\n}\n\nexport class ServerError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'SERVER_ERROR', category: 'server', retryable: true, ...options });\n this.name = 'ServerError';\n }\n}\n\n/**\n * Issue #24: a 2xx whose body does not parse as JSON and whose `Content-Type`\n * is NOT a JSON media type (the vendor maintenance / edge HTML page). The\n * vendor never processed the request — `retryable` is advisory (the transport\n * retries it per policy on idempotent methods only). The raw, HOST-SOURCED\n * free text lives ONLY in `details.bodySnippet` (the first 256 bytes,\n * truncation-only — name-based redaction is a no-op on free text; untrusted\n * host content for the served surface). A JSON-ish header\n * (`application/json*` or a plus-json suffix media type) or an ABSENT\n * header keeps `INVALID_RESPONSE` (the #13/W-A7 shape-drift key); JSON\n * under any other header still decodes (the decode attempt is\n * unconditional).\n */\nexport class UnexpectedContentTypeError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'UNEXPECTED_CONTENT_TYPE', category: 'server', retryable: true, ...options });\n this.name = 'UnexpectedContentTypeError';\n }\n}\n\n/**\n * Issue #25: a 2xx with an EMPTY body where a result was expected (the\n * transport's `expectBody` contract — non-DELETE by default; DELETE and 204\n * keep returning `undefined`). A blank 200 from a proxy or maintenance edge\n * is a transport fault, not \"no data\". `retryable` is advisory (true for\n * non-DELETE reads — the loop never retries 2xx). `details = { httpStatus,\n * method }`. The transport attaches the typed empty-reason details (issue\n * #14) on it before throwing, so a pinned blind surface keeps its stamp.\n */\nexport class EmptyResponseError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'EMPTY_RESPONSE', category: 'server', ...options });\n this.name = 'EmptyResponseError';\n }\n}\n\n/**\n * Issue #26: the host circuit breaker is OPEN and the call was refused\n * LOCALLY (pre-send — zero upstream calls, no hourly-limiter stamp, the\n * #6 cooldown gate's slot). `retryable: true` is a DELIBERATE divergence\n * from #6's `RATE_LIMITED_COOLDOWN` (`retryable: false`): the open period\n * is bounded and advertised via `retryAfter`, so retrying the SAME call\n * after the wait is the correct caller behaviour (service health, not\n * request shape — no narrowing needed). `notSent: true` is the shared\n * local-refusal marker. `details = { state: 'open' | 'half-open',\n * retryAfterMs, failureCount }` rides the error (and the MCP served\n * payload) verbatim.\n */\nexport class CircuitBreakerError extends AutotaskError {\n /** Seconds remaining in the open period (absent when the half-open probe budget is in flight). */\n retryAfter?: number;\n /** True when the call was refused locally (the circuit is open) and never sent. */\n notSent?: boolean;\n\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'CIRCUIT_BREAKER_OPEN', category: 'policy', retryable: true, ...options });\n this.name = 'CircuitBreakerError';\n }\n}\n\n/**\n * Skill 3.5.0 / L2 (finding A1): an opt-in `hostPolicy` bound refused the\n * configured (or discovery-provided) host at CONFIG resolution — a typed\n * config error, thrown BEFORE any wire activity (zero fetch; the issue-#43\n * re-point never happens and the original 401 propagates untouched).\n * `retryable: false` (the same contract as the #6 cooldown refusal): the\n * bound is a caller policy, not service health, so retrying the identical\n * call cannot succeed. `details = { bound: 'private' | 'allowlist',\n * origin }` rides the error verbatim and names the offending canonical\n * origin.\n */\nexport class HostPolicyDeniedError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'HOST_POLICY_DENIED', category: 'policy', retryable: false, ...options });\n this.name = 'HostPolicyDeniedError';\n }\n}\n\nexport class ResolutionError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: options.code === undefined ? 'RESOLUTION_AMBIGUOUS' : options.code,\n category: 'resolution',\n ...options,\n });\n this.name = 'ResolutionError';\n }\n}\n\nexport class PaginationLimitError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: 'PAGINATION_LIMIT',\n category: 'policy',\n suggestedAction:\n options.suggestedAction ??\n 'Narrow the query with a tighter filter so the walk stays under the 1000-page limit.',\n ...options,\n });\n this.name = 'PaginationLimitError';\n }\n}\n\nexport class QueryTooLongError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: 'QUERY_TOO_LONG',\n category: 'policy',\n suggestedAction:\n options.suggestedAction ??\n 'Use the default POST query path (omit via: \"get\") for filters above the 2048-char GET cap.',\n ...options,\n });\n this.name = 'QueryTooLongError';\n }\n}\n\n/** One vendor field rejection, parsed from the error body. */\nexport interface VendorFieldError {\n message?: string;\n field?: string;\n code?: string;\n}\n\n/**\n * Parse the vendor `errors` array defensively (swagger documents no error\n * bodies). TWO live-verified shapes:\n * 1. object entries `[{ message, field?, code? }]` (the node seed shape);\n * 2. STRING entries (the ww29 live-verified shape — S12-A discovery,\n * e.g. `errors: [\"Missing Required Field: title.\", \"Data violation: ...\",\n * \"Error updating entity for record number [1].\"]`). A string entry\n * matching `Missing Required Field: <name>` yields `{ field: <name>,\n * message: <the string> }`; any other string yields `{ message }`.\n * Mixed arrays are supported; other entry types are dropped.\n */\nconst MISSING_REQUIRED_FIELD = /^Missing Required Field:\\s*([A-Za-z_][A-Za-z0-9_]*)/;\n\nexport function parseVendorErrors(body: unknown): VendorFieldError[] | undefined {\n if (!isRecord(body) || !Array.isArray(body.errors)) return undefined;\n const out: VendorFieldError[] = [];\n for (const entry of body.errors) {\n if (typeof entry === 'string') {\n const item: VendorFieldError = { message: entry };\n const m = MISSING_REQUIRED_FIELD.exec(entry);\n if (m) item.field = m[1];\n out.push(item);\n continue;\n }\n if (!isRecord(entry)) continue;\n const item: VendorFieldError = {};\n if (typeof entry.message === 'string') item.message = entry.message;\n if (typeof entry.field === 'string') item.field = entry.field;\n if (typeof entry.code === 'string') item.code = entry.code;\n if (item.message !== undefined || item.field !== undefined || item.code !== undefined) {\n out.push(item);\n }\n }\n return out;\n}\n\n/**\n * #23: the deterministic vendor 500 phrase list — a documented HEURISTIC that\n * holds only wording seen in real responses (the vendor answers some rejected\n * input with a 500, e.g. a field value over its maxLength). Anything not\n * matched stays a plain (retryable) server error. Extend only with a new\n * live-verified phrase.\n */\nconst DETERMINISTIC_VENDOR_500_PHRASES: readonly RegExp[] = [/exceeds maximum length/i];\n\n/**\n * #23: true when the parsed vendor `errors[]` entries of a 500 name a known\n * deterministic field-validation phrase (case-insensitive, over every\n * entry's message — string and object entries alike; `parseVendorErrors`\n * normalises both). The shared signal for the transport's no-retry decision\n * and the #26 breaker predicate (key on this, never on INVALID_RESPONSE).\n */\nexport function isDeterministicVendor500(entries: VendorFieldError[] | undefined): boolean {\n if (entries === undefined) return false;\n return entries.some(\n (entry) => entry.message !== undefined && DETERMINISTIC_VENDOR_500_PHRASES.some((phrase) => phrase.test(entry.message as string)),\n );\n}\n\n/** Format one vendor entry as `[<code>] Field '<field>': <message>` (absent parts dropped). */\nfunction formatVendorEntry(entry: VendorFieldError): string {\n const parts: string[] = [];\n if (entry.code) parts.push(`[${entry.code}]`);\n if (entry.field) parts.push(`Field '${entry.field}':`);\n if (entry.message) parts.push(entry.message);\n return parts.join(' ');\n}\n\n/**\n * The vendor detail line: entries joined with ` | `, or the top-level vendor\n * `message`, or undefined when the body names nothing.\n */\nexport function formatVendorDetail(body: unknown): string | undefined {\n const entries = parseVendorErrors(body);\n if (entries && entries.length > 0) {\n const formatted = entries.map(formatVendorEntry).filter((line) => line.length > 0);\n if (formatted.length > 0) return formatted.join(' | ');\n }\n if (isRecord(body) && typeof body.message === 'string' && body.message.trim().length > 0) {\n return body.message.trim();\n }\n return undefined;\n}\n\n/**\n * A vendor code adopted as the stable machine code: a single token of at least\n * 3 chars containing at least one digit (e.g. `Itgenatr005`, `E001`). Plain\n * words (`Invalid`) and sentences are not machine codes.\n */\nfunction isMachineCode(code: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_-]{2,}$/.test(code) && /\\d/.test(code);\n}\n\n/** The class for a documented status (unmapped statuses return the base). */\ntype ErrorCtor = new (message: string, options: AutotaskErrorOptions) => AutotaskError;\n\n/** The class for a documented status (4xx table + 5xx ServerError); unmapped → null. */\nfunction errorClassForStatus(status: number): ErrorCtor | null {\n switch (status) {\n case 400: return BadRequestError;\n case 401: return UnauthorizedError;\n case 403: return ForbiddenError;\n case 404: return NotFoundError;\n case 409:\n case 412: return ConflictError;\n case 422: return UnprocessableEntityError;\n case 429: return RateLimitError;\n default:\n return status >= 500 && status < 600 ? ServerError : null;\n }\n}\n\nfunction statusDefaultMessage(status: number): string {\n switch (status) {\n case 401: return 'Authentication failed: Invalid credentials';\n case 404: return 'Resource not found';\n default: return `Autotask API request failed with status ${status}`;\n }\n}\n\n/** Suffix length cap for the vendor body appended to the default status message. */\nconst VENDOR_BODY_SUFFIX_LIMIT = 200;\n\n/**\n * Render the (already redacted) vendor body as a short suffix for the default\n * status message. Parsed bodies are JSON.stringified; a raw non-JSON text body\n * passes through as text. Absent and empty bodies (`{}`, `[]`) render nothing\n * — the message stays exactly the status default.\n */\nfunction vendorBodySuffix(body: unknown): string | undefined {\n const rendered = typeof body === 'string' ? body : JSON.stringify(body);\n if (rendered === undefined || rendered === 'null' || rendered === '{}' || rendered === '[]') return undefined;\n return rendered.length > VENDOR_BODY_SUFFIX_LIMIT ? rendered.slice(0, VENDOR_BODY_SUFFIX_LIMIT) : rendered;\n}\n\n/**\n * What the transport knows about the credential values it actually put on the wire for the failed\n * attempt. Only the header NAMES are carried — a value never leaves the transport.\n */\nexport interface CredentialShapeExpectation {\n /** Credential header names whose values were sent. */\n headerNames: readonly string[];\n /** True when EVERY one of those values had a clean shape. */\n allValuesClean: boolean;\n /** The shape artifact found, when one was found (never the value itself). */\n problem?: string;\n}\n\n/** The two fixed, value-free 401 sentences. */\nconst DIAGNOSTIC_SHAPE_ANOMALY =\n 'sent value shows shell-quoting/line-break artifacts — check your env load';\nconst DIAGNOSTIC_NO_ANOMALY =\n 'sent value shows no shape anomalies — credentials or account state are the likely cause';\n\n/** The pointer a 401's shape diagnostic carries to the canonical env load. */\nexport const CREDENTIAL_SHAPE_POINTER =\n 'Load the credential the way the file documents: shell-sourced (`set -a; . ./.env; set +a`) or ' +\n 'via loadAutotaskCredentialsFromEnv() from node-autotask — a quote-preserving parser hands the ' +\n 'value over with its quotes intact, which the vendor rejects as invalid credentials.';\n\n/**\n * The `details` extras a 401 gains from the credential shape of the sent value. Returns `undefined`\n * when there is nothing to say (no expectation supplied), so an `errorFromStatus(401, body)` call\n * behaves exactly as before.\n */\nfunction credentialDiagnosticDetails(\n credential: CredentialShapeExpectation | undefined,\n): Record<string, unknown> | undefined {\n if (credential === undefined) return undefined;\n const diagnostic = credential.allValuesClean\n ? DIAGNOSTIC_NO_ANOMALY\n : `${DIAGNOSTIC_SHAPE_ANOMALY} (${credential.problem ?? 'shape anomaly detected'})`;\n return { diagnostic, pointerNote: CREDENTIAL_SHAPE_POINTER };\n}\n\n/**\n * Merge the extras a 401 already carries (the issue-#43 `zoneRecovery` detail, the issue-#14\n * pointer/emptyReason) with the C3 credential diagnostic, field by field. Later fields win.\n */\nexport function mergeDetails(\n base: Record<string, unknown> | undefined,\n extra: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (base === undefined) return extra;\n if (extra === undefined) return base;\n return { ...base, ...extra };\n}\n\nfunction suggestedActionForStatus(status: number): string | undefined {\n switch (status) {\n case 400:\n case 422:\n return 'Fix the request payload; see the vendor error for the offending field.';\n case 401:\n return 'Check the API integration code, username and secret (3-header auth).';\n case 403:\n return 'Verify permissions; if ImpersonationResourceId is set, retry without it.';\n case 404:\n return 'Verify the id, or resolve the record by name first.';\n case 409:\n case 412:\n return 'Re-read the record and retry with current values.';\n case 429:\n return 'Back off and retry; honour Retry-After.';\n default:\n return status >= 500 ? 'Retry with backoff; the server error is transient.' : undefined;\n }\n}\n\n/**\n * Map an HTTP status + raw vendor body to the typed error (ARCHITECTURE\n * section 10). Keeps the raw body under `vendorError` and adopts a vendor\n * `code` that looks like a stable machine code (top-level, then the first\n * entry's) — otherwise the status-derived code is kept.\n *\n * The INV-A1 hotfix (second site): the vendor body is deep-redacted ONCE,\n * before anything is derived from it — so `vendorError` and the adopted\n * message (computed from the redacted body) never carry a pinned field value\n * (a 4xx that echoes a request body which carried a secret would otherwise\n * leak through the error path). `redactPersonalData` (default true) gates\n * the PII/CONFIDENTIAL classes; the SECRET class is always redacted.\n *\n * When the body names nothing (no `errors[]` entry, no top-level `message`),\n * the default status message gains a `: <body>` suffix — the redacted body\n * (parsed → JSON text, raw → text) truncated to 200 chars — so 4xx/5xx\n * triage sees the vendor text in the message itself.\n */\nexport function errorFromStatus(\n status: number,\n body: unknown,\n url?: string,\n operation?: string,\n redactPersonalData = true,\n credential?: CredentialShapeExpectation,\n): AutotaskError {\n const safeBody = redactResponseBody(body, { redactPersonalData });\n let detail = formatVendorDetail(safeBody);\n // message hygiene: the parsed-entry detail honors the same 200-char bound\n // as the raw-body suffix (a long vendor error string never floods the message)\n if (detail !== undefined && detail.length > VENDOR_BODY_SUFFIX_LIMIT) {\n detail = detail.slice(0, VENDOR_BODY_SUFFIX_LIMIT);\n }\n const suffix = detail === undefined ? vendorBodySuffix(safeBody) : undefined;\n const message =\n detail ?? (suffix !== undefined ? `${statusDefaultMessage(status)}: ${suffix}` : statusDefaultMessage(status));\n const mapped = errorClassForStatus(status);\n const Ctor: ErrorCtor = mapped ?? AutotaskError;\n const code = mapped !== null ? defaultCodeForClass(mapped) : `HTTP_${status}`;\n const entries = parseVendorErrors(safeBody);\n const vendorCodeCandidate =\n (isRecord(safeBody) && typeof safeBody.code === 'string' ? safeBody.code : undefined) ??\n (entries?.[0]?.code ?? undefined);\n // C3 (2026-10-07 incident class): a 401 whose sent credential values carried a shell-quoting or\n // line-break artifact gains a value-free `details.diagnostic` naming the env load as the suspect.\n // The message and `suggestedAction` are unchanged (append, never replace) — the diagnostic rides\n // as a separate field, and a direct `errorFromStatus(401, body)` call (no expectation supplied)\n // behaves exactly as before.\n const credentialDetails = status === 401 ? credentialDiagnosticDetails(credential) : undefined;\n const extraDetails = mergeDetails(undefined, credentialDetails);\n const err = new Ctor(message, {\n code: vendorCodeCandidate !== undefined && isMachineCode(vendorCodeCandidate) ? vendorCodeCandidate : code,\n httpStatus: status,\n vendorError: safeBody,\n url,\n operation,\n retryable: status === 429 || status >= 500,\n suggestedAction: suggestedActionForStatus(status),\n ...(extraDetails !== undefined ? { details: extraDetails } : {}),\n });\n if (Ctor === AutotaskError) err.name = 'AutotaskError';\n // #23: a deterministic vendor field-validation 500 (a known phrase) is a\n // PERMANENT failure — the same body fails identically on retry. Keep the\n // class (ServerError) + code (SERVER_ERROR) + httpStatus (500), override\n // the 5xx retryable default, and point at the field catalog (the\n // deterministic suggestedAction — no vendor free text).\n if (status >= 500 && isDeterministicVendor500(entries)) {\n err.retryable = false;\n err.details = mergeDetails(err.details, { deterministic: true });\n err.suggestedAction =\n 'Deterministic field rejection — fix the value, do not retry. ' +\n 'Consult operations.fieldCatalog for the field catalog (types, required, maxLength).';\n }\n return err;\n}\n\n/**\n * Stale-object protection (ARCHITECTURE section 19.3): the caller-supplied\n * `lastModifiedDate` no longer matches the vendor's current value. No\n * `If-Match`/ETag exists in the API — the plan's `staleCheck` field is the\n * comparison.\n */\nexport class StaleObjectError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, {\n code: 'STALE_OBJECT',\n category: 'conflict',\n suggestedAction: 'Re-read the record and retry with the fresh lastModifiedDate.',\n ...options,\n });\n this.name = 'StaleObjectError';\n }\n}\n\n/**\n * A deliberate-act refusal (section 19.5 R4): a destructive or\n * approval-gated operation was invoked without its exact confirmation flag.\n */\nexport class ConfirmationRequiredError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'CONFIRMATION_REQUIRED', category: 'policy', ...options });\n this.name = 'ConfirmationRequiredError';\n }\n}\n\n/**\n * Issue #9 (P1): the vendor defines no DELETE for the requested resource —\n * a `recovery` delete refused PRE-SEARCH (zero wire). The note carries the\n * spec-derived boundary sentence (plan.deleteBoundaries) + the UI-only\n * cleanup remedy. Never a raw vendor 405: the boundary is known locally\n * (the vendored spec audit) and the refusal happens before any request.\n */\nexport class DeleteBoundaryError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'DELETE_BOUNDARY', category: 'policy', ...options });\n this.name = 'DeleteBoundaryError';\n }\n}\n\n/**\n * Issue #9 (P1): a matched record's id is NOT representable as a safe JS\n * integer (beyond Number.MAX_SAFE_INTEGER) — the match CANNOT be addressed\n * through the SDK's typed delete surface. Never a silent skip: the op\n * refuses with this code (delete) or marks the match id null (find) so the\n * caller sees the unaddressable record and can clean it up via the UI.\n */\nexport class MarkerUnsafeIdError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'MARKER_UNSAFE_ID', category: 'policy', ...options });\n this.name = 'MarkerUnsafeIdError';\n }\n}\n\n/**\n * Issue #9: the recovery's bounded search TRIPPED its match cap (more\n * matches exist than `limit`) — the op refuses instead of returning a\n * silently truncated (or silently empty) result. Retry with a higher\n * `limit` (max 100) or a narrower `marker` / `filter`.\n */\nexport class RecoveryTruncatedError extends AutotaskError {\n constructor(message: string, options: AutotaskErrorOptions = {}) {\n super(message, { code: 'RECOVERY_TRUNCATED', category: 'policy', ...options });\n this.name = 'RecoveryTruncatedError';\n }\n}\n\n/** The status-derived machine code for each documented class. */\nfunction defaultCodeForClass(Ctor: ErrorCtor): string {\n switch (Ctor) {\n case BadRequestError: return 'BAD_REQUEST';\n case UnauthorizedError: return 'UNAUTHORIZED';\n case ForbiddenError: return 'FORBIDDEN';\n case NotFoundError: return 'NOT_FOUND';\n case ConflictError: return 'CONFLICT';\n case UnprocessableEntityError: return 'VALIDATION_FAILED';\n case RateLimitError: return 'RATE_LIMITED';\n default: return 'SERVER_ERROR';\n }\n}\n\n/** Type guard for the hierarchy. */\nexport function isAutotaskError(err: unknown): err is AutotaskError {\n return err instanceof AutotaskError;\n}\n","/**\n * Credential VALUE shape checks — the intake guard for the 2026-10-07 incident class.\n *\n * A `.env` file may SINGLE-QUOTE a value on purpose (a secret containing `$` must be\n * single-quoted so the shell does not expand it). The shell strips those quotes when the file\n * is loaded with `set -a; . ./.env; set +a`; a quote-PRESERVING loader (most `dotenv` variants,\n * a hand-rolled `split('=')`) hands the value over with its quotes intact. Such a value is\n * printable ASCII, so it passes every check in the transport, reaches the vendor as\n * `Secret: 'a$b'` and comes back as an opaque 401 that looks like bad credentials. The\n * incidents this guards against cost three probe cycles before anyone suspected the load.\n *\n * `credentialShapeProblem()` names the artifact WITHOUT ever repeating the value; callers turn it\n * into a typed, value-free error (construction) or a value-free `diagnostic` (401 annotation).\n *\n * Two knobs match the two call sites:\n * - interior CR/LF is always reported (a leak risk and a fetch `TypeError` risk, unhealthy for a\n * value however it was loaded);\n * - edge whitespace and surrounding quotes are reported by default and only skipped where the\n * caller legitimately normalizes blank/trim (`skipEdgeWhitespace`, `skipSurroundingQuotes`).\n */\n\n/** The shape artifacts a loaded credential value can carry. */\nexport type CredentialShapeProblem =\n | 'leading whitespace'\n | 'trailing whitespace'\n | 'single- or double-quote surrounding the value'\n | 'carriage return';\n\n/** Where the guards do not apply, because the caller normalizes that artifact itself. */\nexport interface CredentialShapeOptions {\n /** Skip the edge-whitespace check (call sites that refuse whitespace-only values). */\n skipEdgeWhitespace?: boolean;\n /** Skip the surrounding-quote check (call sites that refuse whitespace-only values). */\n skipSurroundingQuotes?: boolean;\n}\n\nconst QUOTE_CHARS = new Set([\"'\", '\"']);\n\n/** True when `value` starts AND ends with a quote character (one shell-quote artifact). */\nexport function hasSurroundingQuotes(value: string): boolean {\n if (value.length < 2) return false;\n const first = value[0] as string;\n return QUOTE_CHARS.has(first) && value[value.length - 1] === first;\n}\n\n/**\n * The FIRST shape problem in `value`, or `undefined` when its shape is clean. Value-free by\n * construction: the result is one of the fixed strings in {@link CredentialShapeProblem}.\n * A CR is reported even in the middle of a value; CRLF is caught by the same check.\n */\nexport function credentialShapeProblem(\n value: string,\n options: CredentialShapeOptions = {},\n): CredentialShapeProblem | undefined {\n if (!options.skipEdgeWhitespace) {\n if (/^\\s/.test(value)) return 'leading whitespace';\n if (/\\s$/.test(value)) return 'trailing whitespace';\n }\n if (!options.skipSurroundingQuotes && hasSurroundingQuotes(value)) {\n return 'single- or double-quote surrounding the value';\n }\n if (value.includes('\\r')) return 'carriage return';\n return undefined;\n}\n\n/** The env-load pitfall every shape rejection points at, without claiming which loader was used. */\nexport const CREDENTIAL_ENV_LOAD_ACTION =\n 'value appears shell-quoted or line-break contaminated — check how your env file was loaded ' +\n '(single-quoted values must be shell-sourced, not parsed by a quote-preserving loader)';\n\n/**\n * Shortest value the 2-character prefix summary is printed for. Below it a prefix is a large\n * fraction of the secret, so the summary prints `(short)` instead of two characters.\n */\nexport const MIN_PREFIX_SUMMARY_LENGTH = 4;\n\n/**\n * A value-free summary of a credential value: its LENGTH and its FIRST TWO CHARACTERS only, or\n * `(short)` when the value is too short for a 2-character prefix to be safe. The rest of the\n * value is never reproduced, so the summary is safe to print in a log, a CLI report or a test.\n */\nexport function credentialValueSummary(value: string): string {\n return value.length >= MIN_PREFIX_SUMMARY_LENGTH\n ? `len ${value.length}, starts \"${value.slice(0, 2)}\"`\n : 'short value (length withheld)';\n}\n","/**\n * Opt-in live field-metadata TTL cache (issue #31 — the field channel).\n *\n * Mirrors the `ReadCache` idiom (`src/cache.ts`) deliberately: a plain\n * in-memory `Map`, no disk, no dependency; `structuredClone` on get and\n * set (a caller mutating its result cannot corrupt a later hit); lazy\n * purge on read; on `set` past the cap, purge expired first, then evict\n * the oldest-inserted. The client owns ONE instance\n * (`fieldCache: { ttlMs, maxEntities }` -> the resolved config's\n * `fieldCache`, threaded through the shared `HttpClient`); the base\n * metadata path (resources/base.ts, the entityInformation trio)\n * consults it before issuing a wire GET.\n *\n * What is cached — and only that: SUCCESSFUL entity-metadata reads — the\n * UNWRAPPED values of the `getEntityInfo` / `getFieldInfo` /\n * `getUdfInfo` trio (the `info` model, the `fields[]` catalogs, the\n * `userDefinedFields[]` catalog). Keyed by `${resourceKey}:${kind}` —\n * one entity's three catalogs, e.g. `tickets:fields`.\n *\n * What is NEVER cached: an EMPTY result (`[]` / `{}` / null — an empty\n * is not an answer: a transient vendor hiccup must not become a\n * permanent lie), and a FAILURE (errors reject before any `set` can run).\n *\n * Three behaviours this channel needs that `ReadCache` does not:\n * - IN-FLIGHT DE-DUPLICATION (`inflight` / `track`): an MCP server may\n * serve several tool calls concurrently — concurrent callers for the\n * same (entity, kind) share ONE wire request (the promise is dropped\n * on settle, success OR failure);\n * - FIRST-CLASS `invalidate(resourceKey)`: the drift signal — a\n * deterministic vendor field-validation 500 (the vendor just said our\n * field belief is wrong) or an INVALID_RESPONSE on a metadata read\n * (the catalog shape moved) drops the ONE entity's entries so the next\n * call refetches; an ordinary record write says nothing about the\n * field catalog and never invalidates;\n * - `peek(resourceKey, kind)`: a non-mutating `{ hit, age }` probe the\n * served op (operations.fieldCatalog) uses for its per-row\n * `cache: { hit, age }` reporting without consuming the entry.\n *\n * Staleness contract (the documented trade of opting in): a vendor\n * drift (a field-ladder 500 carrying `details.deterministic: true`, or\n * an INVALID_RESPONSE shape drift) invalidates the entity's entries;\n * anything the drift signals do not name shows up once `ttlMs` expires.\n * Field metadata only — record reads are `cache` (a different channel\n * with a different key and invalidation signal). ON by default (issue\n * #80): with `fieldCache` absent the default instance is built;\n * `fieldCache: false` is the explicit opt-out — no `FieldCache` instance\n * at all, and the trio's wire path is bit-for-bit the uncached one.\n */\nimport { AutotaskConfigError } from './errors.js';\n\n/** One stored metadata read: the (unwrapped) value + its expiry instant. */\ninterface FieldCacheEntry {\n value: unknown;\n /** `Date.now()` instant at which the entry stops being served. */\n expiresAt: number;\n}\n\n/** Memory guard: the default entity bound (a long-lived MCP server must\n * not grow without bound between lazy purges). */\nexport const FIELD_CACHE_MAX_ENTITIES = 256;\n\n/** The three metadata reads one entity can serve (closed set). */\nexport const FIELD_CACHE_KINDS = ['info', 'fields', 'udf'] as const;\n\n/** One of the three per-entity metadata channels. */\nexport type FieldCacheKind = (typeof FIELD_CACHE_KINDS)[number];\n\n/**\n * A read-through TTL cache for successful entity-metadata reads (lazy\n * purge on read; expiry is `Date.now()` based). Constructed by\n * `resolveConfig` from `fieldCache: { ttlMs, maxEntities }` — a\n * positive-integer `ttlMs` is required (validated here, as in ReadCache).\n */\nexport class FieldCache {\n /** The configured TTL in ms. */\n readonly ttlMs: number;\n /** The entity bound (the cap applies to STORED entries; inflight never counts). */\n readonly maxEntities: number;\n private readonly store: Map<string, FieldCacheEntry> = new Map();\n private readonly inflightMap: Map<string, Promise<unknown>> = new Map();\n\n constructor(ttlMs: number, maxEntities: number = FIELD_CACHE_MAX_ENTITIES) {\n if (!Number.isInteger(ttlMs) || ttlMs <= 0) {\n throw new AutotaskConfigError(`fieldCache.ttlMs must be a positive integer (got ${ttlMs})`);\n }\n if (!Number.isInteger(maxEntities) || maxEntities <= 0) {\n throw new AutotaskConfigError(`fieldCache.maxEntities must be a positive integer (got ${maxEntities})`);\n }\n this.ttlMs = ttlMs;\n this.maxEntities = maxEntities;\n }\n\n /** The composite key: one entity's catalogs are one key apart. */\n static key(resourceKey: string, kind: FieldCacheKind): string {\n return `${resourceKey}:${kind}`;\n }\n\n /**\n * Read-through lookup: the live entry's value (a copy), or `undefined`\n * (absent OR expired — an expired entry is purged lazily on this read).\n */\n get(resourceKey: string, kind: FieldCacheKind): unknown {\n const entry = this.store.get(FieldCache.key(resourceKey, kind));\n if (entry === undefined) return undefined;\n if (entry.expiresAt <= Date.now()) {\n this.store.delete(FieldCache.key(resourceKey, kind));\n return undefined;\n }\n // A copy: a caller mutating its result must not corrupt later hits.\n return structuredClone(entry.value);\n }\n\n /**\n * Store a SUCCESSFUL, NON-EMPTY metadata value under (entity, kind),\n * live for `ttlMs`. An EMPTY value (`[]` / `{}` / null) is refused\n * silently (never cached — an empty is not an answer): the next call\n * refetches.\n */\n set(resourceKey: string, kind: FieldCacheKind, value: unknown): void {\n if (FieldCache.isEmpty(value)) return;\n const key = FieldCache.key(resourceKey, kind);\n if (this.store.size >= this.maxEntities && this.purgeExpired() === 0) {\n // all live: evict the oldest-inserted entry so the cache stays bounded\n const oldest = this.store.keys().next();\n if (!oldest.done) this.store.delete(oldest.value);\n }\n // Map keeps insertion order: refreshes re-insert so the memory guard\n // drops the OLDEST-inserted entries first on the next purge.\n this.store.delete(key);\n this.store.set(key, { value: structuredClone(value), expiresAt: Date.now() + this.ttlMs });\n }\n\n /** True for the values that must never be cached (an empty is not an answer). */\n static isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n }\n\n /**\n * In-flight de-duplication: the shared in-flight promise for\n * (entity, kind), or `undefined` (nothing in flight — the caller\n * issues the request and registers it with `track`).\n */\n inflight(resourceKey: string, kind: FieldCacheKind): Promise<unknown> | undefined {\n return this.inflightMap.get(FieldCache.key(resourceKey, kind));\n }\n\n /**\n * Register an in-flight metadata read: concurrent callers for the same\n * (entity, kind) await the SAME promise (one wire request). The entry\n * is dropped on settle — success OR failure (a failure is never\n * cached; the next caller refetches).\n */\n track(resourceKey: string, kind: FieldCacheKind, promise: Promise<unknown>): Promise<unknown> {\n const key = FieldCache.key(resourceKey, kind);\n this.inflightMap.set(key, promise);\n // Drop the entry on settle (success OR failure). The two-armed `.then`\n // keeps the DERIVED promise resolved, so a failing read can never\n // surface as an unhandled rejection through this bookkeeping.\n promise.then(\n () => {\n this.inflightMap.delete(key);\n },\n () => {\n this.inflightMap.delete(key);\n },\n );\n return promise;\n }\n\n /**\n * The drift signal: drop the entity's STORED entries AND its in-flight\n * promise (a refetch must not join a request whose premise just moved).\n * A no-op when the entity holds nothing.\n */\n invalidate(resourceKey: string): void {\n for (const kind of FIELD_CACHE_KINDS) {\n const key = FieldCache.key(resourceKey, kind);\n this.store.delete(key);\n this.inflightMap.delete(key);\n }\n }\n\n /**\n * A non-mutating probe for the served op's per-row `cache` report:\n * `hit` = a live (unexpired) entry exists; `age` = ms since that entry\n * was stored (null when `hit` is false). Never purges, never clones.\n */\n peek(resourceKey: string, kind: FieldCacheKind): { hit: boolean; age: number | null } {\n const entry = this.store.get(FieldCache.key(resourceKey, kind));\n if (entry === undefined || entry.expiresAt <= Date.now()) {\n return { hit: false, age: null };\n }\n return { hit: true, age: Date.now() - (entry.expiresAt - this.ttlMs) };\n }\n\n /** Drop every expired entry (returns the number removed). */\n purgeExpired(): number {\n const now = Date.now();\n let removed = 0;\n for (const [key, entry] of this.store) {\n if (entry.expiresAt <= now) {\n this.store.delete(key);\n removed += 1;\n }\n }\n return removed;\n }\n\n /** Current entry count (live + not-yet-purged expired). */\n get size(): number {\n return this.store.size;\n }\n\n /** Drop everything (e.g. a caller that knows the tenant was reset). */\n clear(): void {\n this.store.clear();\n this.inflightMap.clear();\n }\n}\n","/**\n * The optional per-host circuit breaker at the transport (issue #26).\n *\n * #6 gates a TENANT after a 429. Nothing equivalent existed for a vendor\n * that is DOWN: during an outage or a maintenance window every call burns\n * its full retry budget and the agent keeps issuing new ones. The breaker\n * counts SERVICE-FAILURE outcomes per HOST (a zone outage hits every tenant\n * on that zone — vendor health is host-scoped, so the key is the host of\n * the configured base URL, not #6's `user@host`) and fails further calls\n * for that host LOCALLY — a typed `CircuitBreakerError` (`code:\n * 'CIRCUIT_BREAKER_OPEN'`, `notSent: true`, `retryable: true`, `retryAfter`\n * = the remaining open time) with zero upstream calls — until the open\n * period passes and `successesToClose` probe successes prove the host is\n * healthy again.\n *\n * OFF by default (`circuitBreaker: { enabled: true }` opts in). Defaults\n * from the prior art (tphakala/go-autotask `circuitbreaker.go`): 5 counted\n * failures in a 10-second window open the circuit for 30 seconds;\n * `successesToClose` 2 probe successes close it; `halfOpenProbes` bounds the\n * probes admitted while half-open (default `= successesToClose`, validated\n * `>= successesToClose` — a breaker that can never close is a misconfiguration\n * and is refused fail-closed at construction).\n *\n * Timer-free (the #6 cooldown design decision): the state is pure\n * timestamps and everything is derived from `Date.now()` lazily at each\n * request — `closed` (no entry / nothing armed), `open` (until\n * `openedAt + openTimeoutMs`), then the lazy `half-open` transition on the\n * first request after the open period. No `setInterval`, no injected clock\n * (the test suite fakes time with `vi.useFakeTimers()`, exactly like\n * `test/cooldown.test.ts`).\n *\n * The DEFAULT failure predicate counts exactly: `NETWORK_ERROR`, `TIMEOUT`,\n * a vendor 429 (by status — a surfaced 429 may carry an ADOPTED vendor\n * machine code, e.g. the thread-threshold `Itgenatr005`), a 5xx EXCEPT the\n * deterministic field-validation 500 (keyed on #23's `details.deterministic`\n * signal — by that signal only), and `UNEXPECTED_CONTENT_TYPE` (the #24\n * maintenance page, by code — NEVER `INVALID_RESPONSE`: the W-A7 shape-drift\n * and the #13 marker-recovery key are untouched). Never counted: `ABORTED`\n * (a caller's cancellation says nothing about service health), any 4xx, and\n * local/policy refusals (the cooldown gate's `notSent` refusal, the local\n * hourly limiter, config errors) — a call that never reached the vendor is\n * never a service failure.\n *\n * Store: the default is the in-process in-memory map shared by every client\n * instance (entries capped at 1024, evicting the OLDEST last-activity first\n * — failing open: the longest-idle host loses state, an actively failing or\n * open host keeps its). The default store is deliberately NOT anchored on\n * globalThis (the #6 precedent): a process that loads both the ESM and the\n * CJS build gets one map per build — inject one shared `CircuitBreakerStore`\n * if you need cross-build sharing (the interface leaves room for a\n * Redis-backed store). The state RIDES THE STORE, not the client: a pool\n * LRU eviction of a tenant client loses nothing (an evicted-then-recreated\n * tenant on the same host hits the same shared state). On a shared-host\n * gateway (one host, many credential tuples) the breaker is PER HOST — one\n * tenant's outage opens the circuit for that host's other tenants too (the\n * documented consequence of the host-only key; `enabled` is off by default,\n * so nothing changes unless opted in). `thresholdInformation.get()` bypasses\n * the REFUSAL so a downed host can still be probed for headroom — its\n * outcome is still RECORDED (a 2xx closes toward recovery; a failure\n * re-arms; the #6 ThresholdInformation-bypass semantics).\n */\n\nimport type { AutotaskError } from './errors.js';\n\n/**\n * One host's breaker state (all epoch ms). `openedAt === null` = closed;\n * `openedAt + openTimeoutMs > now` = open; after that the state is\n * half-open (the lazy transition — no timers). `probes` bounds the probes\n * admitted while half-open (`halfOpenProbes`); every probe completion\n * (success OR failure) decrements it. The transport never stores an empty\n * closed entry: closing the circuit DELETES the entry (a healthy host\n * leaves no trace — the #6 delete-on-2xx precedent).\n */\nexport interface CircuitBreakerState {\n /** Counted-failure timestamps (pruned to the failure window at record time). */\n failures: number[];\n /** When the circuit (re)opened (epoch ms); null while closed. */\n openedAt: number | null;\n /** Probe successes toward `successesToClose` (the current open/half-open phase). */\n successes: number;\n /** Probes admitted while half-open (in flight or awaiting a verdict). */\n probes: number;\n}\n\n/**\n * Per-host breaker state: the SAME get/set/delete shape as `CooldownStore`\n * (`src/cooldown.ts`), over the richer `CircuitBreakerState` (a single\n * deadline number cannot hold a state machine + counters).\n */\nexport interface CircuitBreakerStore {\n /** The host's state, or undefined when nothing is recorded for it (= closed). */\n get(hostKey: string): CircuitBreakerState | undefined;\n /** Store (or replace) the host's state. */\n set(hostKey: string, state: CircuitBreakerState): void;\n /** Delete the host's entry (close reset, a healthy host leaves no trace). */\n delete(hostKey: string): void;\n}\n\n/** Counted-failure window: \"5 failures in 10 s\" (the prior-art default). */\nexport const DEFAULT_CIRCUIT_BREAKER_WINDOW_MS = 10_000;\n/** Counted failures inside the window that open the circuit. */\nexport const DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD = 5;\n/** How long the circuit stays open before the half-open probes. */\nexport const DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS = 30_000;\n/** Probe successes that close the circuit. */\nexport const DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE = 2;\n/** Entry cap of the default in-memory store. */\nexport const DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES = 1024;\n\n/**\n * The default in-memory store: a capped Map, evicting the entry with the\n * OLDEST last-activity first when full (failing open — the longest-idle\n * host goes; an actively failing or an open host keeps its state).\n * Last-activity = `openedAt` when armed, else the newest `failures`\n * timestamp (a closed entry always carries >= 1 failure).\n */\nexport class InMemoryCircuitBreakerStore implements CircuitBreakerStore {\n private readonly maxEntries: number;\n private readonly states = new Map<string, CircuitBreakerState>();\n\n constructor(maxEntries: number = DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES) {\n if (!Number.isInteger(maxEntries) || maxEntries <= 0) {\n throw new TypeError(`InMemoryCircuitBreakerStore maxEntries must be a positive integer (got ${String(maxEntries)})`);\n }\n this.maxEntries = maxEntries;\n }\n\n get(hostKey: string): CircuitBreakerState | undefined {\n return this.states.get(hostKey);\n }\n\n set(hostKey: string, state: CircuitBreakerState): void {\n if (this.states.has(hostKey)) {\n this.states.set(hostKey, state);\n return;\n }\n if (this.states.size >= this.maxEntries) {\n let victim: string | undefined;\n let victimActivity = Number.POSITIVE_INFINITY;\n for (const [key, s] of this.states) {\n const activity = s.openedAt !== null ? s.openedAt : (s.failures.length > 0 ? (s.failures[s.failures.length - 1] as number) : 0);\n if (activity < victimActivity) {\n victimActivity = activity;\n victim = key;\n }\n }\n if (victim !== undefined) this.states.delete(victim);\n }\n this.states.set(hostKey, state);\n }\n\n delete(hostKey: string): void {\n this.states.delete(hostKey);\n }\n\n /** Drop every entry (test helper surface; also used by resetDefaultCircuitBreakerStore). */\n clear(): void {\n this.states.clear();\n }\n}\n\n/**\n * The shared default store (one per process, per module build — see the\n * module header). Lazily created on first use; never re-created behind a\n * holder's back (resetDefaultCircuitBreakerStore CLEARS, it does not\n * replace). Survives pool LRU eviction (the state rides the store, not the\n * client).\n */\nlet defaultStore: InMemoryCircuitBreakerStore | undefined;\n\n/** The default in-process store, created on first call. */\nexport function defaultCircuitBreakerStore(): CircuitBreakerStore {\n if (defaultStore === undefined) defaultStore = new InMemoryCircuitBreakerStore();\n return defaultStore;\n}\n\n/** Reset helper for tests: clears the shared default store. */\nexport function resetDefaultCircuitBreakerStore(): void {\n defaultStore?.clear();\n}\n\n/**\n * The breaker key: the lowercased HOST of the (normalised) base URL —\n * host-only (issue #26's \"per-host keying\"; decision: vendor health is\n * host-scoped, not credential-scoped). A host can never contain `@` or\n * `:`-ambiguity beyond the standard `host:port` form; impersonation (a\n * header, not key material) does not change it. The same derivation as\n * `buildTenantKey`'s host part (`src/cooldown.ts`).\n */\nexport function buildBreakerKey(baseUrl: string): string {\n return new URL(baseUrl).host.toLowerCase();\n}\n\n/**\n * The DEFAULT failure predicate (injectable via\n * `config.circuitBreaker.isFailure`): what counts against the circuit.\n * Counts exactly — `NETWORK_ERROR`, `TIMEOUT`, a vendor 429 (by STATUS: a\n * surfaced 429 may carry an adopted vendor machine code as its stable\n * code, e.g. the thread-threshold `Itgenatr005`), a 5xx EXCEPT the\n * deterministic field-validation 500 (#23's `details.deterministic`\n * signal — by that signal only), and `UNEXPECTED_CONTENT_TYPE` (the #24\n * maintenance page, by code). Never counts: `ABORTED`, any 4xx, a\n * local/policy refusal (`notSent` — a local refusal, the cooldown's or the\n * breaker's own, never reached the vendor), or `INVALID_RESPONSE` (the\n * W-A7 shape-drift / #13 marker-recovery key).\n */\nexport function isBreakerFailure(err: AutotaskError): boolean {\n // A local refusal is never a service failure: the call never reached the\n // vendor (defense in depth — the gate's own refusals are thrown pre-loop\n // and never reach a recording site). `notSent` is the shared local-refusal\n // marker (the cooldown's RateLimitError and the breaker's own\n // CircuitBreakerError both carry it; the base class does not).\n if ((err as { notSent?: boolean }).notSent === true) return false;\n // Transport-class failures (stable codes, no vendor status).\n if (err.code === 'NETWORK_ERROR' || err.code === 'TIMEOUT') return true;\n const status = err.httpStatus;\n if (status === undefined) return false; // a local error: nothing reached the vendor\n if (status === 429) return true; // a 429 the vendor actually sent\n if (status >= 500 && status < 600) {\n // A 5xx — EXCEPT the deterministic field-validation 500 (the same body\n // fails identically on retry; it says nothing about service health).\n return err.details?.deterministic !== true;\n }\n // A non-JSON 2xx (the #24 maintenance/edge page). The 2xx path never\n // adopts a vendor code, so the code is stable here.\n return err.code === 'UNEXPECTED_CONTENT_TYPE';\n}\n","/**\n * Per-tenant 429 cooldown gate (issue #6).\n *\n * Once the transport has used up its retries on a 429 (or the Retry-After is\n * too long to wait, or the method is non-retriable), the vendor has said\n * \"stop\" — but an agent that repeats the same calls within seconds keeps\n * hitting a tenant that is already over its threshold, and the repeats can\n * prolong the throttle. The gate remembers the cooldown DEADLINE per tenant\n * (lowercased username + lowercased host; impersonation does not change the\n * key) and fails every further call for that tenant LOCALLY — a typed\n * `RateLimitError` with `notSent: true`, zero upstream calls — until the\n * deadline passes.\n *\n * Defaults (decisions from the issue): ON by default with a 15-minute hard\n * cap; `Retry-After` missing or unparseable -> a 60-second window; the\n * thread-threshold 429 (vendor code `Itgenatr005`, clears in seconds) arms\n * only a short window: min(Retry-After, 10 s), default 5 s. A 2xx from a\n * call that got through clears the gate early; expiry is lazy (the first\n * call after the deadline deletes the entry and proceeds); a hostile\n * Retry-After is clamped to the cap, so a lock-out is always bounded.\n *\n * Store: the default is the in-process in-memory map shared by every client\n * instance (entries capped at 1024, evicting the EARLIEST deadline first —\n * failing open; a tenant that keeps 429-ing keeps its fresh deadline). The\n * default store is deliberately NOT anchored on globalThis: a process that\n * loads both the ESM and the CJS build gets one map per build — inject one\n * shared `CooldownStore` if you need cross-build sharing (the interface\n * leaves room for a Redis-backed store). `thresholdInformation.get()`\n * bypasses the gate so a throttled tenant can still read its own headroom\n * (a 2xx clears; a 429 re-arms).\n */\n\n/** One tenant's armed cooldown: get/set/delete of the deadline (epoch ms). */\nexport interface CooldownStore {\n /** The armed deadline (epoch ms) for the tenant key, or undefined when not armed. */\n get(tenantKey: string): number | undefined;\n /** Arm (or re-arm) the tenant's gate until `deadline` (epoch ms). */\n set(tenantKey: string, deadline: number): void;\n /** Delete the tenant's entry (lazy expiry, early clear on 2xx). */\n delete(tenantKey: string): void;\n}\n\n/** Hard cap on a tenant lock-out: a hostile `Retry-After` is clamped here. */\nexport const DEFAULT_COOLDOWN_MAX_MS = 15 * 60 * 1000;\n/** Window when `Retry-After` is missing or unparseable. */\nexport const DEFAULT_COOLDOWN_DEFAULT_MS = 60_000;\n/** Entry cap of the default in-memory store. */\nexport const DEFAULT_COOLDOWN_MAX_ENTRIES = 1024;\n/** Thread-threshold 429 (`Itgenatr005`) window: min(Retry-After, 10 s). */\nconst THREAD_THRESHOLD_MAX_MS = 10_000;\n/** Thread-threshold 429 window when Retry-After is missing/unparseable. */\nconst THREAD_THRESHOLD_DEFAULT_MS = 5_000;\n\n/**\n * The default in-memory store: a capped Map, evicting the entry with the\n * EARLIEST deadline first when full (failing open — a tenant that keeps\n * 429-ing keeps its fresh deadline; the soonest-to-expire entries go).\n */\nexport class InMemoryCooldownStore implements CooldownStore {\n private readonly maxEntries: number;\n private readonly deadlines = new Map<string, number>();\n\n constructor(maxEntries: number = DEFAULT_COOLDOWN_MAX_ENTRIES) {\n if (!Number.isInteger(maxEntries) || maxEntries <= 0) {\n throw new TypeError(`InMemoryCooldownStore maxEntries must be a positive integer (got ${String(maxEntries)})`);\n }\n this.maxEntries = maxEntries;\n }\n\n get(tenantKey: string): number | undefined {\n return this.deadlines.get(tenantKey);\n }\n\n set(tenantKey: string, deadline: number): void {\n if (this.deadlines.has(tenantKey)) {\n this.deadlines.set(tenantKey, deadline);\n return;\n }\n if (this.deadlines.size >= this.maxEntries) {\n let victim: string | undefined;\n let victimDeadline = Number.POSITIVE_INFINITY;\n for (const [key, d] of this.deadlines) {\n if (d < victimDeadline) {\n victimDeadline = d;\n victim = key;\n }\n }\n if (victim !== undefined) this.deadlines.delete(victim);\n }\n this.deadlines.set(tenantKey, deadline);\n }\n\n delete(tenantKey: string): void {\n this.deadlines.delete(tenantKey);\n }\n\n /** Drop every entry (test helper surface; also used by resetDefaultCooldownStore). */\n clear(): void {\n this.deadlines.clear();\n }\n}\n\n/**\n * The shared default store (one per process, per module build — see the\n * module header). Lazily created on first use; never re-created behind a\n * holder's back (resetDefaultCooldownStore CLEARS, it does not replace).\n */\nlet defaultStore: InMemoryCooldownStore | undefined;\n\n/** The default in-process store, created on first call. */\nexport function defaultCooldownStore(): CooldownStore {\n if (defaultStore === undefined) defaultStore = new InMemoryCooldownStore();\n return defaultStore;\n}\n\n/** Reset helper for tests: clears the shared default store. */\nexport function resetDefaultCooldownStore(): void {\n defaultStore?.clear();\n}\n\n/**\n * The tenant key: lowercased username + `@` + lowercased host. A host can\n * never contain `@`, so the key is unambiguous; impersonation (a header,\n * not part of the key) does not change it.\n */\nexport function buildTenantKey(userName: string, baseUrl: string): string {\n return `${userName.toLowerCase()}@${new URL(baseUrl).host.toLowerCase()}`;\n}\n\n/**\n * The cooldown window (ms) for a 429 about to surface. `retryAfterSecs` is\n * the parsed `Retry-After` (undefined when missing/unparseable — the parser\n * never returns negatives). Normal 429: Retry-After clamped to `maxMs`,\n * defaulting to `defaultMs`. Thread-threshold 429 (`Itgenatr005`): a short\n * window — min(Retry-After, 10 s), default 5 s — it clears in seconds.\n */\nexport function cooldownDurationMs(\n retryAfterSecs: number | undefined,\n opts: { maxMs: number; defaultMs: number; threadThreshold?: boolean },\n): number {\n if (opts.threadThreshold) {\n const secs = retryAfterSecs !== undefined\n ? Math.min(retryAfterSecs, Math.round(THREAD_THRESHOLD_MAX_MS / 1000))\n : Math.round(THREAD_THRESHOLD_DEFAULT_MS / 1000);\n return Math.max(0, secs) * 1000;\n }\n const rawMs = retryAfterSecs !== undefined ? retryAfterSecs * 1000 : opts.defaultMs;\n return Math.min(rawMs, opts.maxMs);\n}\n","/**\n * Read-through TTL cache for successful single-record reads (docs/API.md\n * section 11.15 — the per-resource TTL contract; `cache: { ttlMs?,\n * perResourceTtlMs? } | false` — issue #80 default-on; issue #32 adds the\n * per-resource TTL overrides).\n *\n * Zero runtime dependencies: a plain in-memory `Map`, no external library,\n * no disk. The client owns ONE instance (`config.cache` -> the resolved\n * config's `readCache`, threaded through the shared `HttpClient`); the base\n * read path (resources/base.ts) consults it before issuing a wire GET.\n *\n * What is cached — and only that:\n * - SUCCESSFUL single-record reads: the get-by-id path (global and\n * parent-scoped) and the numeric-id branch of `resolve` (the shared\n * `fetchRecordRaw`). Keyed by (resource, id) — the exact read path,\n * e.g. `/V1.0/Companies/42` (a parent-scoped read's path carries the\n * parent id, so ids under different parents never collide);\n * - the CACHED PAYLOAD is the same redacted shape the transport returns:\n * the shared redaction transform (`redactResponseBody`) runs inside\n * `HttpClient.request` BEFORE the value ever reaches the cache —\n * pre-redaction data never enters it.\n *\n * What is NEVER cached: mutations (create/update/delete — the base\n * primitives never touch the cache), list/query reads (every `query`/\n * `count`/walk goes straight to the wire), and error results (a failure\n * throws before a `set` can run — a 5xx/shape-drift fault is never stored).\n * ONE exception (issue #36): the composite context fetch (`contextFetch`)\n * stores the vendor's TRUE not-found on an FK target (the HTTP 404 or the\n * 200 `item: null` signal) as an 'absent' marker under a namespaced key the\n * positive path never constructs — the repeat composite serves 'absent'\n * with zero wire; the marker expires on the read entity's TTL and dies with\n * any real write. The positive `.get`/`resolve` 404 behaviour is untouched\n * (a `.get` miss still re-wires, as before).\n *\n * Staleness contract (the documented trade of opting in): the vendor is\n * STATEFUL. A cached read is a snapshot AT FETCH TIME. Mutations are never\n * cached, and any real write through this client clears the whole cache\n * (`HttpClient.request`), so a write-then-read on the SAME client\n * re-fetches (a read already in flight across the write is not stored — the\n * invalidation epoch). Writes made elsewhere (another client, the Autotask UI) show\n * up only once `ttlMs` expires. Mutation-path reads (the stale-object guard,\n * dry-run diffs) bypass the cache entirely. Per-resource overrides\n * (issue #32): `cache.perResourceTtlMs` maps a resource plan key to its\n * own TTL in ms — `set` keys the entry's expiry by the plan key of the\n * entity the cache key (the wire path) points to, falling back to\n * `ttlMs` when the map is absent or does not name the resource (absent\n * map = bit-for-bit the pre-#32 behaviour). ON by default (issue #80):\n * with `cache` absent the default instance is built; `cache: false` is\n * the explicit opt-out — no `ReadCache` instance at all, and the read\n * path is bit-for-bit the uncached one.\n */\nimport { AutotaskConfigError } from './errors.js';\n\n/** One stored read: the (redacted) payload + its expiry instant. */\ninterface CacheEntry {\n value: unknown;\n /** `Date.now()` instant at which the entry stops being served. */\n expiresAt: number;\n}\n\n/** Memory guard: when the entry count reaches this on a `set`, expired\n * entries are purged first (a long-lived MCP server must not grow without\n * bound between lazy purges). */\nexport const READ_CACHE_MAX_ENTRIES = 4096;\n\n/**\n * A read-through TTL cache (lazy purge on read; expiry is `Date.now()`\n * based). Constructed by `resolveConfig` from `cache: { ttlMs,\n * perResourceTtlMs? }` — a positive-integer `ttlMs` is required\n * (validated there too); every `perResourceTtlMs` value is a positive\n * integer, validated fail-closed the same way (issue #32).\n */\nexport class ReadCache {\n /** The configured TTL in ms (the fallback for resources without an override). */\n readonly ttlMs: number;\n /** The per-resource TTL overrides (issue #32; absent = every resource uses `ttlMs`). */\n readonly perResourceTtlMs?: Readonly<Record<string, number>>;\n private readonly store: Map<string, CacheEntry> = new Map();\n private epochCounter = 0;\n\n constructor(ttlMs: number, perResourceTtlMs?: Record<string, number>) {\n if (!Number.isInteger(ttlMs) || ttlMs <= 0) {\n throw new AutotaskConfigError(`cache.ttlMs must be a positive integer (got ${ttlMs})`);\n }\n // issue #32: the per-resource overrides — fail closed like ttlMs (a\n // bad override value is a config error, never a silently-short TTL).\n if (perResourceTtlMs !== undefined) {\n if (\n perResourceTtlMs === null ||\n typeof perResourceTtlMs !== 'object' ||\n Array.isArray(perResourceTtlMs)\n ) {\n throw new AutotaskConfigError(\n `cache.perResourceTtlMs must be an object of resource key -> ms (got ${String(perResourceTtlMs)})`,\n );\n }\n for (const [key, value] of Object.entries(perResourceTtlMs)) {\n if (key === '') {\n throw new AutotaskConfigError('cache.perResourceTtlMs keys must be non-empty resource keys');\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new AutotaskConfigError(\n `cache.perResourceTtlMs.${key} must be a positive integer (got ${String(value)})`,\n );\n }\n }\n }\n this.ttlMs = ttlMs;\n this.perResourceTtlMs = perResourceTtlMs;\n }\n\n /**\n * The TTL (ms) for a resource plan key: the `perResourceTtlMs` override\n * when the map is present and names the resource, else the base\n * `ttlMs` (absent map, absent key, and `undefined` all fall back).\n */\n ttlFor(resource?: string): number {\n if (resource !== undefined && this.perResourceTtlMs !== undefined) {\n const override = this.perResourceTtlMs[resource];\n if (override !== undefined) return override;\n }\n return this.ttlMs;\n }\n\n /**\n * Read-through lookup: the live entry's value, or `undefined` (absent OR\n * expired — an expired entry is purged lazily on this read).\n */\n get(key: string): unknown {\n const entry = this.store.get(key);\n if (entry === undefined) return undefined;\n if (entry.expiresAt <= Date.now()) {\n this.store.delete(key);\n return undefined;\n }\n // A copy: a caller mutating its result must not corrupt later hits.\n return structuredClone(entry.value);\n }\n\n /** Store a successful read payload under `key`, live for `ttlFor(resource)`:\n * the per-resource override (issue #32) when named, else `ttlMs`.\n * `epoch` is the invalidation epoch the caller captured BEFORE its wire\n * read: a read that straddled a `clear()` (a write) is dropped, never\n * re-stored with its pre-write body. */\n set(key: string, value: unknown, resource?: string, epoch: number = this.epochCounter): void {\n if (epoch !== this.epochCounter) return;\n if (this.store.size >= READ_CACHE_MAX_ENTRIES && this.purgeExpired() === 0) {\n // all live: evict the oldest-inserted entry so the cache stays bounded\n const oldest = this.store.keys().next();\n if (!oldest.done) this.store.delete(oldest.value);\n }\n // Map keeps insertion order: refreshes re-insert so the memory guard\n // drops the OLDEST-inserted entries first on the next purge.\n this.store.delete(key);\n this.store.set(key, { value: structuredClone(value), expiresAt: Date.now() + this.ttlFor(resource) });\n }\n\n /** Drop every expired entry (returns the number removed). */\n purgeExpired(): number {\n const now = Date.now();\n let removed = 0;\n for (const [key, entry] of this.store) {\n if (entry.expiresAt <= now) {\n this.store.delete(key);\n removed += 1;\n }\n }\n return removed;\n }\n\n /** Current entry count (live + not-yet-purged expired). */\n get size(): number {\n return this.store.size;\n }\n\n /** Drop one key (issue #36: a later positive outcome clears a stale 'absent' marker). */\n delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /** The invalidation epoch: bumped by `clear()`; capture it before a wire\n * read and pass it to `set` so a read in flight across a write cannot\n * re-store its stale answer. */\n get epoch(): number {\n return this.epochCounter;\n }\n\n /** Drop everything (e.g. a caller that knows the tenant was reset). */\n clear(): void {\n this.epochCounter += 1;\n this.store.clear();\n }\n}\n","/**\n * Per-resource read-cache TTL tables (issue #32).\n * GENERATED by scripts/generate-capabilities.mjs from capabilities.plan.json\n * (the 7th generated artifact; the plan is the ONLY input). Do not\n * hand-edit; re-run the generator. The drift guard is\n * scripts/check-capabilities.mjs (clause 8a) +\n * test/scripts/cache-ttl-artifact.test.ts.\n *\n * Consumers:\n * - DEFAULT_PER_RESOURCE_TTL_MS: the plan-derived DEFAULT per-resource\n * table for `cache.perResourceTtlMs` — reference-class resources\n * (the human-timescale lookup tables: CACHE_TTL_REFERENCE_KEYS, pinned\n * in scripts/lib/cache-ttl.mjs) carry the 1h class, every other plan\n * resource the 5min class. One row per plan resource so the operator's\n * map keys are always valid against the plan. Issue #80: the table is\n * the DEFAULT per-resource map — an absent perResourceTtlMs means every\n * plan resource rides its table row (1h reference / 5min default) and a\n * plan-unnamed path rides cache.ttlMs; operator entries override table\n * entries (spread + per-operator pins).\n * - RESOURCE_KEY_BY_PATH: `/V1.0/<Entity>` -> plan key (the 121\n * entity-kind resources). BaseResource.fetchRecordRaw uses it to key a\n * cross-entity read's cache entry by the READ ENTITY's plan key (a\n * contact read through tickets.getContext expires on the contact's\n * TTL, not the ticket's).\n *\n * planHash: ac8d4bed714eeae53029f1da07c0305ab80916424dab448904f865c715b192c6\n */\n// [GENERATED:CACHETTL:START]\nexport const CACHE_TTL_REFERENCE_KEYS: readonly string[] = [\"billing_codes\",\"countries\",\"departments\",\"phases\",\"roles\",\"services\"];\nexport const CACHE_TTL_REFERENCE_MS = 3600000;\nexport const CACHE_TTL_DEFAULT_MS = 300000;\nexport const DEFAULT_PER_RESOURCE_TTL_MS: Readonly<Record<string, number>> = {\n \"appointments\": 300000,\n \"authenticate\": 300000,\n \"billing_codes\": 3600000,\n \"billing_items\": 300000,\n \"change_request_links\": 300000,\n \"checklist_libraries\": 300000,\n \"checklist_library_checklist_items\": 300000,\n \"classification_icons\": 300000,\n \"companies\": 300000,\n \"company_alerts\": 300000,\n \"company_locations\": 300000,\n \"company_notes\": 300000,\n \"company_site_configurations\": 300000,\n \"company_webhooks\": 300000,\n \"configuration_item_billing_product_associations\": 300000,\n \"configuration_item_categories\": 300000,\n \"configuration_item_category_udf_associations\": 300000,\n \"configuration_item_dns_records\": 300000,\n \"configuration_item_notes\": 300000,\n \"configuration_item_related_items\": 300000,\n \"configuration_item_ssl_subject_alternative_names\": 300000,\n \"configuration_item_types\": 300000,\n \"configuration_item_webhooks\": 300000,\n \"configuration_items\": 300000,\n \"contact_group_contacts\": 300000,\n \"contact_groups\": 300000,\n \"contact_webhooks\": 300000,\n \"contacts\": 300000,\n \"contract_billing_rules\": 300000,\n \"contract_block_hour_factors\": 300000,\n \"contract_blocks\": 300000,\n \"contract_charges\": 300000,\n \"contract_exclusion_billing_codes\": 300000,\n \"contract_exclusion_roles\": 300000,\n \"contract_exclusion_set_excluded_roles\": 300000,\n \"contract_exclusion_set_excluded_work_types\": 300000,\n \"contract_exclusion_sets\": 300000,\n \"contract_milestones\": 300000,\n \"contract_notes\": 300000,\n \"contract_rates\": 300000,\n \"contract_retainers\": 300000,\n \"contract_role_costs\": 300000,\n \"contract_service_adjustments\": 300000,\n \"contract_service_bundle_adjustments\": 300000,\n \"contract_service_bundle_units\": 300000,\n \"contract_service_bundles\": 300000,\n \"contract_service_units\": 300000,\n \"contract_services\": 300000,\n \"contract_ticket_purchases\": 300000,\n \"contracts\": 300000,\n \"countries\": 3600000,\n \"departments\": 3600000,\n \"domain_registrars\": 300000,\n \"entity_information\": 300000,\n \"expense_item_attachments\": 300000,\n \"expense_items\": 300000,\n \"expense_reports\": 300000,\n \"holiday_sets\": 300000,\n \"holidays\": 300000,\n \"inventory_products\": 300000,\n \"invoices\": 300000,\n \"modules\": 300000,\n \"notification_history\": 300000,\n \"opportunities\": 300000,\n \"opportunity_attachments\": 300000,\n \"opportunity_categories\": 300000,\n \"phases\": 3600000,\n \"product_vendors\": 300000,\n \"products\": 300000,\n \"project_charges\": 300000,\n \"project_notes\": 300000,\n \"projects\": 300000,\n \"purchase_approvals\": 300000,\n \"purchase_order_item_receiving\": 300000,\n \"purchase_order_items\": 300000,\n \"purchase_orders\": 300000,\n \"quote_items\": 300000,\n \"quote_locations\": 300000,\n \"quote_templates\": 300000,\n \"quotes\": 300000,\n \"resource_role_queues\": 300000,\n \"resource_roles\": 300000,\n \"resource_skills\": 300000,\n \"resource_time_off_additional\": 300000,\n \"resource_time_off_approvers\": 300000,\n \"resource_time_off_balances\": 300000,\n \"resources\": 300000,\n \"roles\": 3600000,\n \"service_call_task_resources\": 300000,\n \"service_call_tasks\": 300000,\n \"service_call_ticket_resources\": 300000,\n \"service_call_tickets\": 300000,\n \"service_calls\": 300000,\n \"service_level_agreement_results\": 300000,\n \"services\": 3600000,\n \"skills\": 300000,\n \"subscription_periods\": 300000,\n \"subscriptions\": 300000,\n \"survey_results\": 300000,\n \"surveys\": 300000,\n \"tag_aliases\": 300000,\n \"tag_groups\": 300000,\n \"tags\": 300000,\n \"task_secondary_resources\": 300000,\n \"tasks\": 300000,\n \"threshold_information\": 300000,\n \"ticket_additional_configuration_items\": 300000,\n \"ticket_additional_contacts\": 300000,\n \"ticket_attachments\": 300000,\n \"ticket_categories\": 300000,\n \"ticket_category_field_defaults\": 300000,\n \"ticket_change_request_approvals\": 300000,\n \"ticket_charges\": 300000,\n \"ticket_checklist_items\": 300000,\n \"ticket_checklist_libraries\": 300000,\n \"ticket_history\": 300000,\n \"ticket_note_attachments\": 300000,\n \"ticket_note_webhooks\": 300000,\n \"ticket_notes\": 300000,\n \"ticket_secondary_resources\": 300000,\n \"ticket_webhooks\": 300000,\n \"tickets\": 300000,\n \"time_entries\": 300000,\n \"time_entry_attachments\": 300000,\n \"time_off_requests\": 300000,\n \"version\": 300000,\n \"version_information\": 300000,\n \"zone_information\": 300000\n};\nexport const RESOURCE_KEY_BY_PATH: Readonly<Record<string, string>> = {\n \"/V1.0/Appointments\": \"appointments\",\n \"/V1.0/BillingCodes\": \"billing_codes\",\n \"/V1.0/BillingItems\": \"billing_items\",\n \"/V1.0/ChangeRequestLinks\": \"change_request_links\",\n \"/V1.0/ChecklistLibraries\": \"checklist_libraries\",\n \"/V1.0/ChecklistLibraryChecklistItems\": \"checklist_library_checklist_items\",\n \"/V1.0/ClassificationIcons\": \"classification_icons\",\n \"/V1.0/Companies\": \"companies\",\n \"/V1.0/CompanyAlerts\": \"company_alerts\",\n \"/V1.0/CompanyLocations\": \"company_locations\",\n \"/V1.0/CompanyNotes\": \"company_notes\",\n \"/V1.0/CompanySiteConfigurations\": \"company_site_configurations\",\n \"/V1.0/CompanyWebhooks\": \"company_webhooks\",\n \"/V1.0/ConfigurationItemBillingProductAssociations\": \"configuration_item_billing_product_associations\",\n \"/V1.0/ConfigurationItemCategories\": \"configuration_item_categories\",\n \"/V1.0/ConfigurationItemCategoryUdfAssociations\": \"configuration_item_category_udf_associations\",\n \"/V1.0/ConfigurationItemDnsRecords\": \"configuration_item_dns_records\",\n \"/V1.0/ConfigurationItemNotes\": \"configuration_item_notes\",\n \"/V1.0/ConfigurationItemRelatedItems\": \"configuration_item_related_items\",\n \"/V1.0/ConfigurationItemSslSubjectAlternativeNames\": \"configuration_item_ssl_subject_alternative_names\",\n \"/V1.0/ConfigurationItemTypes\": \"configuration_item_types\",\n \"/V1.0/ConfigurationItemWebhooks\": \"configuration_item_webhooks\",\n \"/V1.0/ConfigurationItems\": \"configuration_items\",\n \"/V1.0/ContactGroupContacts\": \"contact_group_contacts\",\n \"/V1.0/ContactGroups\": \"contact_groups\",\n \"/V1.0/ContactWebhooks\": \"contact_webhooks\",\n \"/V1.0/Contacts\": \"contacts\",\n \"/V1.0/ContractBillingRules\": \"contract_billing_rules\",\n \"/V1.0/ContractBlockHourFactors\": \"contract_block_hour_factors\",\n \"/V1.0/ContractBlocks\": \"contract_blocks\",\n \"/V1.0/ContractCharges\": \"contract_charges\",\n \"/V1.0/ContractExclusionBillingCodes\": \"contract_exclusion_billing_codes\",\n \"/V1.0/ContractExclusionRoles\": \"contract_exclusion_roles\",\n \"/V1.0/ContractExclusionSetExcludedRoles\": \"contract_exclusion_set_excluded_roles\",\n \"/V1.0/ContractExclusionSetExcludedWorkTypes\": \"contract_exclusion_set_excluded_work_types\",\n \"/V1.0/ContractExclusionSets\": \"contract_exclusion_sets\",\n \"/V1.0/ContractMilestones\": \"contract_milestones\",\n \"/V1.0/ContractNotes\": \"contract_notes\",\n \"/V1.0/ContractRates\": \"contract_rates\",\n \"/V1.0/ContractRetainers\": \"contract_retainers\",\n \"/V1.0/ContractRoleCosts\": \"contract_role_costs\",\n \"/V1.0/ContractServiceAdjustments\": \"contract_service_adjustments\",\n \"/V1.0/ContractServiceBundleAdjustments\": \"contract_service_bundle_adjustments\",\n \"/V1.0/ContractServiceBundleUnits\": \"contract_service_bundle_units\",\n \"/V1.0/ContractServiceBundles\": \"contract_service_bundles\",\n \"/V1.0/ContractServiceUnits\": \"contract_service_units\",\n \"/V1.0/ContractServices\": \"contract_services\",\n \"/V1.0/ContractTicketPurchases\": \"contract_ticket_purchases\",\n \"/V1.0/Contracts\": \"contracts\",\n \"/V1.0/Countries\": \"countries\",\n \"/V1.0/Departments\": \"departments\",\n \"/V1.0/DomainRegistrars\": \"domain_registrars\",\n \"/V1.0/ExpenseItemAttachments\": \"expense_item_attachments\",\n \"/V1.0/ExpenseItems\": \"expense_items\",\n \"/V1.0/ExpenseReports\": \"expense_reports\",\n \"/V1.0/HolidaySets\": \"holiday_sets\",\n \"/V1.0/Holidays\": \"holidays\",\n \"/V1.0/InventoryProducts\": \"inventory_products\",\n \"/V1.0/Invoices\": \"invoices\",\n \"/V1.0/NotificationHistory\": \"notification_history\",\n \"/V1.0/Opportunities\": \"opportunities\",\n \"/V1.0/OpportunityAttachments\": \"opportunity_attachments\",\n \"/V1.0/OpportunityCategories\": \"opportunity_categories\",\n \"/V1.0/Phases\": \"phases\",\n \"/V1.0/ProductVendors\": \"product_vendors\",\n \"/V1.0/Products\": \"products\",\n \"/V1.0/ProjectCharges\": \"project_charges\",\n \"/V1.0/ProjectNotes\": \"project_notes\",\n \"/V1.0/Projects\": \"projects\",\n \"/V1.0/PurchaseApprovals\": \"purchase_approvals\",\n \"/V1.0/PurchaseOrderItemReceiving\": \"purchase_order_item_receiving\",\n \"/V1.0/PurchaseOrderItems\": \"purchase_order_items\",\n \"/V1.0/PurchaseOrders\": \"purchase_orders\",\n \"/V1.0/QuoteItems\": \"quote_items\",\n \"/V1.0/QuoteLocations\": \"quote_locations\",\n \"/V1.0/QuoteTemplates\": \"quote_templates\",\n \"/V1.0/Quotes\": \"quotes\",\n \"/V1.0/ResourceRoleQueues\": \"resource_role_queues\",\n \"/V1.0/ResourceRoles\": \"resource_roles\",\n \"/V1.0/ResourceSkills\": \"resource_skills\",\n \"/V1.0/ResourceTimeOffAdditional\": \"resource_time_off_additional\",\n \"/V1.0/ResourceTimeOffApprovers\": \"resource_time_off_approvers\",\n \"/V1.0/ResourceTimeOffBalances\": \"resource_time_off_balances\",\n \"/V1.0/Resources\": \"resources\",\n \"/V1.0/Roles\": \"roles\",\n \"/V1.0/ServiceCallTaskResources\": \"service_call_task_resources\",\n \"/V1.0/ServiceCallTasks\": \"service_call_tasks\",\n \"/V1.0/ServiceCallTicketResources\": \"service_call_ticket_resources\",\n \"/V1.0/ServiceCallTickets\": \"service_call_tickets\",\n \"/V1.0/ServiceCalls\": \"service_calls\",\n \"/V1.0/ServiceLevelAgreementResults\": \"service_level_agreement_results\",\n \"/V1.0/Services\": \"services\",\n \"/V1.0/Skills\": \"skills\",\n \"/V1.0/SubscriptionPeriods\": \"subscription_periods\",\n \"/V1.0/Subscriptions\": \"subscriptions\",\n \"/V1.0/SurveyResults\": \"survey_results\",\n \"/V1.0/Surveys\": \"surveys\",\n \"/V1.0/TagAliases\": \"tag_aliases\",\n \"/V1.0/TagGroups\": \"tag_groups\",\n \"/V1.0/Tags\": \"tags\",\n \"/V1.0/TaskSecondaryResources\": \"task_secondary_resources\",\n \"/V1.0/Tasks\": \"tasks\",\n \"/V1.0/TicketAdditionalConfigurationItems\": \"ticket_additional_configuration_items\",\n \"/V1.0/TicketAdditionalContacts\": \"ticket_additional_contacts\",\n \"/V1.0/TicketAttachments\": \"ticket_attachments\",\n \"/V1.0/TicketCategories\": \"ticket_categories\",\n \"/V1.0/TicketCategoryFieldDefaults\": \"ticket_category_field_defaults\",\n \"/V1.0/TicketChangeRequestApprovals\": \"ticket_change_request_approvals\",\n \"/V1.0/TicketCharges\": \"ticket_charges\",\n \"/V1.0/TicketChecklistItems\": \"ticket_checklist_items\",\n \"/V1.0/TicketChecklistLibraries\": \"ticket_checklist_libraries\",\n \"/V1.0/TicketHistory\": \"ticket_history\",\n \"/V1.0/TicketNoteAttachments\": \"ticket_note_attachments\",\n \"/V1.0/TicketNoteWebhooks\": \"ticket_note_webhooks\",\n \"/V1.0/TicketNotes\": \"ticket_notes\",\n \"/V1.0/TicketSecondaryResources\": \"ticket_secondary_resources\",\n \"/V1.0/TicketWebhooks\": \"ticket_webhooks\",\n \"/V1.0/Tickets\": \"tickets\",\n \"/V1.0/TimeEntries\": \"time_entries\",\n \"/V1.0/TimeEntryAttachments\": \"time_entry_attachments\",\n \"/V1.0/TimeOffRequests\": \"time_off_requests\"\n};\n// [GENERATED:CACHETTL:END]\n","/**\n * Opt-in resource-name TTL cache (issue #65 — the name channel).\n *\n * Mirrors the `FieldCache` idiom (`src/fieldCache.ts`) deliberately: a\n * plain in-memory `Map`, no disk, no dependency; `structuredClone` on\n * get and set (a caller mutating its result cannot corrupt a later hit);\n * lazy purge on read; on `set` past the cap, purge expired first, then\n * evict the oldest-inserted. The client owns ONE instance\n * (`resourceNameCache: { ttlMs, maxEntries }` -> the resolved config's\n * `resourceNameCache`, threaded through the shared `HttpClient`);\n * `operations.expandResourceNames` consults it before issuing a\n * per-id `GET /V1.0/Resources/{id}`.\n *\n * What is cached — and only that: the op's NAME PROJECTION for a vendor\n * resource id — exactly two deterministic vendor answers, the resolved\n * name (`{ name, blind: false }`) and the vendor's TRUE not-found blind\n * marker (`{ name: null, blind: true }` — the issue-#36 absent-marker\n * precedent: a repeat miss costs no wire). Keyed `resources:<id>`\n * (namespaced so a future FK table gets its own prefix — v1 serves\n * `resources` only).\n *\n * Deliberately different from `FieldCache` (the closed metadata trio):\n * - a 200 WITH a record but NO name part (`{ name: null, blind: false }`)\n * IS stored: \"empty is not an answer\" (the fieldCache rule) governs a\n * catalog that can be an empty transient hiccup; a single record's\n * missing name part is a stable vendor fact, and re-wiring it every\n * call would defeat the channel;\n * - a FAILURE is never cached (a fault rejects before any `set` can run);\n * - a real write to the `resources` resource through the same client\n * clears the WHOLE channel (scoped invalidation at the transport —\n * a rename via this client is always fresh); a write to any other\n * resource never invalidates (it says nothing about names).\n *\n * In-flight de-duplication (`inflight` / `track`): a long-lived MCP\n * server may serve several expand calls concurrently — concurrent\n * callers for the same id share ONE wire request (the promise is\n * dropped on settle, success OR failure).\n *\n * Staleness contract (the documented trade of opting in): a resource\n * renamed OUTSIDE this client (the UI, another integration) shows up\n * once `ttlMs` expires; a `resources` write through THIS client clears\n * the channel immediately. ON by default (issue #80): with\n * `resourceNameCache` absent the default instance is built;\n * `resourceNameCache: false` is the explicit opt-out — no\n * `ResourceNameCache` instance at all, and the op is the uncached per-id\n * path (per-call de-dup still applies). Record\n * reads are `cache` (a different channel with a different key and\n * invalidation signal); the op's per-id read rides the ReadCache\n * transparently when it is configured (double layering, disjoint key\n * spaces).\n */\nimport { AutotaskConfigError } from './errors.js';\nimport type { Identifier } from './types/common.js';\n\n/** One stored name answer: the resolved name (null when the vendor\n * returned no name part) + the blind marker (the vendor's true\n * not-found for this id). */\nexport interface ResourceNameEntry {\n /** The composed display name (`firstName [middleName] lastName`,\n * single spaces); null when the record exists but carries no name\n * part (a vendor data gap — distinct from blind). */\n name: string | null;\n /** True when the per-id read is the vendor's true not-found (404 or\n * `200 item: null`) — the table-invisible case the op reports with\n * the id kept and no error. */\n blind: boolean;\n}\n\n/** One stored name answer + its expiry instant. */\ninterface ResourceNameCacheEntry {\n value: ResourceNameEntry;\n /** `Date.now()` instant at which the entry stops being served. */\n expiresAt: number;\n}\n\n/** Memory guard: the default entry bound (a tenant's staff table is at\n * most a few hundred rows; a long-lived MCP server must not grow\n * without bound between lazy purges). */\nexport const RESOURCE_NAME_CACHE_MAX_ENTRIES = 1024;\n\n/** A blind (true not-found) marker lives at most this long: a 404 from a\n * just-created resource or a zone mis-route must not be pinned for the\n * whole TTL. */\nexport const RESOURCE_NAME_CACHE_BLIND_TTL_MS = 60_000;\n\n/**\n * A read-through TTL cache for `operations.expandResourceNames` name\n * answers (lazy purge on read; expiry is `Date.now()` based).\n * Constructed by `resolveConfig` from\n * `resourceNameCache: { ttlMs, maxEntries }` — a positive-integer\n * `ttlMs` is required (validated here, as in ReadCache / FieldCache).\n */\nexport class ResourceNameCache {\n /** The configured TTL in ms. */\n readonly ttlMs: number;\n /** The entry bound (the cap applies to STORED entries; inflight never counts). */\n readonly maxEntries: number;\n private readonly store: Map<string, ResourceNameCacheEntry> = new Map();\n private readonly inflightMap: Map<string, Promise<unknown>> = new Map();\n private epochCounter = 0;\n\n constructor(ttlMs: number, maxEntries: number = RESOURCE_NAME_CACHE_MAX_ENTRIES) {\n if (!Number.isInteger(ttlMs) || ttlMs <= 0) {\n throw new AutotaskConfigError(`resourceNameCache.ttlMs must be a positive integer (got ${ttlMs})`);\n }\n if (!Number.isInteger(maxEntries) || maxEntries <= 0) {\n throw new AutotaskConfigError(`resourceNameCache.maxEntries must be a positive integer (got ${maxEntries})`);\n }\n this.ttlMs = ttlMs;\n this.maxEntries = maxEntries;\n }\n\n /** The namespaced key: `resources:<canonical id>` (the namespace\n * leaves a documented path to future FK tables — v1 serves\n * `resources` only). */\n static key(id: Identifier): string {\n return `resources:${id}`;\n }\n\n /**\n * Read-through lookup: the live entry (a copy), or `undefined`\n * (absent OR expired — an expired entry is purged lazily on this\n * read).\n */\n get(id: Identifier): ResourceNameEntry | undefined {\n const entry = this.store.get(ResourceNameCache.key(id));\n if (entry === undefined) return undefined;\n if (entry.expiresAt <= Date.now()) {\n this.store.delete(ResourceNameCache.key(id));\n return undefined;\n }\n // A copy: a caller mutating its result must not corrupt later hits.\n return structuredClone(entry.value);\n }\n\n /**\n * Store a name answer under the id, live for `ttlMs`. ALWAYS stores\n * (the no-name-part answer `{ name: null, blind: false }` is a stable\n * fact and is cached — the documented difference from the fieldCache\n * empty rule); past the cap, purge expired first, then evict the\n * oldest-inserted (Map insertion order; refreshes re-insert so the\n * memory guard drops the OLDEST-inserted entries first).\n */\n set(id: Identifier, value: ResourceNameEntry, epoch: number = this.epochCounter): void {\n // A read that began before a `clear()` (a write invalidation) must not\n // re-store its pre-write answer: the caller passes the epoch it captured\n // BEFORE the wire read.\n if (epoch !== this.epochCounter) return;\n const key = ResourceNameCache.key(id);\n if (!this.store.has(key) && this.store.size >= this.maxEntries && this.purgeExpired() === 0) {\n // all live: evict the oldest-inserted entry so the cache stays bounded\n const oldest = this.store.keys().next();\n if (!oldest.done) this.store.delete(oldest.value);\n }\n // Map keeps insertion order: refreshes re-insert so the memory guard\n // drops the OLDEST-inserted entries first on the next purge.\n this.store.delete(key);\n this.store.set(key, { value: structuredClone(value), expiresAt: Date.now() + (value.blind ? Math.min(this.ttlMs, RESOURCE_NAME_CACHE_BLIND_TTL_MS) : this.ttlMs) });\n }\n\n /**\n * In-flight de-duplication: the shared in-flight promise for the id,\n * or `undefined` (nothing in flight — the caller issues the request\n * and registers it with `track`).\n */\n inflight(id: Identifier): Promise<unknown> | undefined {\n return this.inflightMap.get(ResourceNameCache.key(id));\n }\n\n /**\n * Register an in-flight name read: concurrent callers for the same id\n * await the SAME promise (one wire request). The entry is dropped on\n * settle — success OR failure (a failure is never cached; the next\n * caller refetches).\n */\n track(id: Identifier, promise: Promise<unknown>): Promise<unknown> {\n const key = ResourceNameCache.key(id);\n this.inflightMap.set(key, promise);\n // Drop the entry on settle (success OR failure). The two-armed `.then`\n // keeps the DERIVED promise resolved, so a failing read can never\n // surface as an unhandled rejection through this bookkeeping.\n promise.then(\n () => {\n this.inflightMap.delete(key);\n },\n () => {\n this.inflightMap.delete(key);\n },\n );\n return promise;\n }\n\n /** Drop every expired entry (returns the number removed). */\n purgeExpired(): number {\n const now = Date.now();\n let removed = 0;\n for (const [key, entry] of this.store) {\n if (entry.expiresAt <= now) {\n this.store.delete(key);\n removed += 1;\n }\n }\n return removed;\n }\n\n /** The invalidation epoch: bumped by `clear()`; capture it before a wire\n * read and pass it to `set` so a stale answer is dropped. */\n get epoch(): number {\n return this.epochCounter;\n }\n\n /** Current entry count (live + not-yet-purged expired). */\n get size(): number {\n return this.store.size;\n }\n\n /**\n * Drop everything — the SCOPED invalidation target: a real write to\n * the `resources` resource through the same client (a rename via this\n * client is always fresh).\n */\n clear(): void {\n this.epochCounter += 1;\n this.store.clear();\n this.inflightMap.clear();\n }\n}\n","/**\n * Config-time host bounds (skill 3.5.0 / L2, finding A1) — PURE functions:\n * no IO, no DNS, no state. Opt-in and OFF by default: an absent\n * `hostPolicy` config block leaves the resolved config byte-identical to\n * before (nothing here runs).\n *\n * Two bounds are expressible, both fail-closed when a host violates them:\n *\n * - `blockPrivateHosts` — refuse a LITERAL private / loopback / link-local\n * host (IPv4 and IPv6). Hostnames are NEVER blocked: there are no DNS\n * lookups, so a literal-IP check cannot see where a name resolves.\n * - `allowedOrigins` — an exact normalised-origin allow-list; every\n * resolved base URL must match an entry (scheme + host:port, default\n * ports dropped by WHATWG canonicalisation).\n *\n * The private bound is checked FIRST and WINS: a host that is both private\n * and explicitly allow-listed is still refused (the allow-list can never\n * widen the private bound away).\n *\n * Every check runs on the CANONICAL host from `new URL(origin).host` — the\n * WHATWG parser hex-canonicalises an embedded IPv4 inside an IPv6 literal,\n * so `::ffff:127.0.0.1` is seen as `::ffff:7f00:1` and must still classify\n * as the private IPv4 `127.0.0.1` (the mapped-IPv4 delegation below).\n */\nimport { HostPolicyDeniedError } from './errors.js';\n\n/** A violation decision — `null` when the host passes the active bounds. */\nexport interface HostPolicyViolation {\n /** The bound that refused the host. */\n bound: 'private' | 'allowlist';\n /** The offending origin, as `new URL(...).origin` canonicalises it. */\n origin: string;\n}\n\n/** Options for {@link isHostAllowed}: omit a bound to leave it inactive. */\nexport interface HostPolicyDecisionOptions {\n /** Refuse literal private / loopback / link-local hosts. */\n blockPrivate?: boolean;\n /** Exact normalised-origin allow-list (already canonicalised by the caller or by {@link normalizeAllowedOrigins}). */\n allowedOrigins?: readonly string[];\n}\n\n/** The canonical host of an origin (WHATWG `URL#host`, lowercased + IP-canonicalised). */\nexport function canonicalHost(origin: string): string {\n return new URL(origin).host;\n}\n\n/** The canonical origin of a base URL (WHATWG `URL#origin`; default ports dropped). */\nexport function canonicalOrigin(origin: string): string {\n return new URL(origin).origin;\n}\n\n/** Dotted-quad → the 32-bit unsigned value, or undefined when malformed. */\nfunction ipv4ToUint32(part: string): number | undefined {\n if (part.includes(':')) return undefined;\n const octets = part.split('.');\n if (octets.length !== 4) return undefined;\n let value = 0;\n for (const octet of octets) {\n if (!/^\\d{1,3}$/.test(octet)) return undefined;\n const n = Number(octet);\n if (n > 255) return undefined;\n value = value * 256 + n;\n }\n return value >>> 0;\n}\n\nconst UINT32 = 0xffffffff;\n\n/** IPv4 literal: 10/8, 172.16/12, 192.168/16, 127/8, 169.254/16 (\"this host on this network\" 0/8 included). */\nexport function isPrivateIpv4(host: string): boolean {\n const value = ipv4ToUint32(host);\n if (value === undefined) return false;\n return (\n within(value, '0.0.0.0', 8) ||\n within(value, '10.0.0.0', 8) ||\n within(value, '127.0.0.0', 8) ||\n within(value, '169.254.0.0', 16) ||\n within(value, '172.16.0.0', 12) ||\n within(value, '192.168.0.0', 16)\n );\n}\n\nfunction within(value: number, network: string, prefix: number): boolean {\n const base = ipv4ToUint32(network);\n if (base === undefined) return false;\n const mask = prefix === 0 ? 0 : (UINT32 << (32 - prefix)) >>> 0;\n return (value & mask) === (base & mask);\n}\n\n/** A 4-digit hex group → its numeric value. */\nfunction parseHexGroup(group: string): number {\n return parseInt(group, 16);\n}\n\n/**\n * The two-hextet tail of an IPv4-mapped IPv6 literal → the dotted-quad, or\n * undefined when the address is not `::ffff:a.b.c.d` (or its canonical\n * hex form `::ffff:7f00:1`, which is what WHATWG produces).\n */\nexport function ipv4MappedAddress(host: string): string | undefined {\n const groups = host.split(':');\n if (groups.length < 3) return undefined;\n // The marker `ffff` sits immediately BEFORE the two IPv4 hextets, so find\n // it from the END: `::ffff:7f00:1` and `::ffff:808:808` both end with it.\n const markerIndex = groups.length - 3;\n if (markerIndex < 0 || groups[markerIndex] !== 'ffff') return undefined;\n // Everything before the marker must be the run of zero groups (\"::\" or\n // \"0:...:0\") — i.e. an IPv4-mapped address, not a global one.\n const head = groups.slice(0, markerIndex);\n const areAllZero = head.every((group) => group === '' || group === '0');\n if (!areAllZero) return undefined;\n // The two hextets after the marker are the embedded IPv4 (0..0xffff each).\n // WHATWG hex-canonicalises an embedded `a.b.c.d` into these groups, so\n // `::ffff:127.0.0.1` arrives as `::ffff:7f00:1` and `::ffff:8.8.8.8` as\n // `::ffff:808:808`.\n const hi = parseHexGroup(groups[markerIndex + 1] ?? '');\n const lo = parseHexGroup(groups[markerIndex + 2] ?? '');\n if (!Number.isFinite(hi) || !Number.isFinite(lo)) return undefined;\n return `${hi >>> 8}.${hi & 0xff}.${lo >>> 8}.${lo & 0xff}`;\n}\n\ninterface Ipv6Range {\n /** First hextet of the range, compared NUMERICALLY. */\n firstHextet: number;\n /** Bit prefix of the range (all IPv6 special-purpose ranges here are >= 10). */\n prefix: number;\n label: string;\n}\n\n/** fc00::/7 (unique-local), fe80::/10 (link-local), ::1 (loopback). */\nconst IPV6_RANGES: readonly Ipv6Range[] = [\n { firstHextet: 0xfc00, prefix: 7, label: 'fc00::/7' },\n { firstHextet: 0xfe80, prefix: 10, label: 'fe80::/10' },\n];\n\n/** Split an IPv6 literal into its 8 hextets (numeric), or undefined when it is not one. */\nfunction ipv6Hextets(host: string): number[] | undefined {\n if (!host.includes(':')) return undefined;\n if (host.includes('.')) return undefined;\n const [headText = '', tailText] = host.split('::');\n if (host.split('::').length > 2) return undefined;\n const head = headText.length > 0 ? headText.split(':') : [];\n const tail = tailText !== undefined && tailText.length > 0 ? tailText.split(':') : [];\n if (tailText === undefined && head.length !== 8) return undefined;\n if (head.length + tail.length > 8) return undefined;\n const groups: number[] = [];\n for (const group of head) {\n if (!/^[0-9a-f]{1,4}$/.test(group)) return undefined;\n groups.push(parseHexGroup(group));\n }\n for (let i = 0; i < 8 - head.length - tail.length; i += 1) groups.push(0);\n for (const group of tail) {\n if (!/^[0-9a-f]{1,4}$/.test(group)) return undefined;\n groups.push(parseHexGroup(group));\n }\n return groups.length === 8 ? groups : undefined;\n}\n\n/** The first hextet of an IPv6 literal (0 when the address starts with \"::\"), or undefined when not IPv6. */\nexport function ipv6FirstHextet(host: string): number | undefined {\n const hextets = ipv6Hextets(host);\n return hextets === undefined ? undefined : hextets[0];\n}\n\n/** IPv6 literal membership in ::1, fc00::/7 or fe80::/10 — FIRST HEXTET COMPARED NUMERICALLY. */\nexport function isPrivateIpv6(host: string): boolean {\n const hextets = ipv6Hextets(host);\n if (hextets === undefined) return false;\n const first = hextets[0] ?? 0;\n if (hextets.every((hextet) => hextet === 0)) return true; // \"::\" — this host\n if (first === 0 && hextets.slice(0, 7).every((hextet) => hextet === 0) && hextets[7] === 1) return true; // ::1\n for (const range of IPV6_RANGES) {\n const shift = 16 - range.prefix;\n if (first >> shift === range.firstHextet >> shift) return true;\n }\n return false;\n}\n\n/** The IPv6 literal of a canonical WHATWG host (`[::1]:4010` -> `::1`), or the host unchanged. */\nexport function literalIpOf(host: string): string {\n const bracketed = /^\\[([^\\]]+)\\]:?/.exec(host);\n if (bracketed !== null) return bracketed[1] ?? '';\n const colon = host.indexOf(':');\n return colon === -1 ? host : host.slice(0, colon);\n}\n\n/**\n * A LITERAL private / loopback / link-local host? Bracketed IPv6 (`[::1]`)\n * and a trailing port are stripped first, and an IPv4-mapped IPv6 literal\n * (`::ffff:127.0.0.1`, canonicalised by WHATWG to `::ffff:7f00:1`)\n * delegates to the IPv4 rules. A hostname (`api.example.com`) is never\n * private — no DNS lookups exist.\n */\nexport function isPrivateHost(host: string): boolean {\n const plain = literalIpOf(host);\n const mapped = ipv4MappedAddress(plain);\n if (mapped !== undefined) return isPrivateIpv4(mapped);\n if (isPrivateIpv4(plain)) return true;\n return isPrivateIpv6(plain);\n}\n\n/** Canonicalise + de-duplicate allow-list entries (WHATWG origins; default ports dropped). */\nexport function normalizeAllowedOrigins(origins: readonly string[]): string[] {\n const seen = new Set<string>();\n for (const entry of origins) seen.add(canonicalOrigin(entry));\n return [...seen];\n}\n\n/**\n * The ONE decision function config validation and the transport both\n * consume. `null` means the host passes the active bounds; a violation\n * carries the bound that refused it and the canonical origin. The private\n * bound is checked FIRST and wins over the allow-list.\n */\nexport function decideHostPolicy(origin: string, options: HostPolicyDecisionOptions): HostPolicyViolation | null {\n const canonical = canonicalOrigin(origin);\n if (options.blockPrivate === true && isPrivateHost(canonicalHost(canonical))) {\n return { bound: 'private', origin: canonical };\n }\n const allow = options.allowedOrigins;\n if (allow !== undefined && allow.length > 0) {\n if (!allow.includes(canonical)) return { bound: 'allowlist', origin: canonical };\n }\n return null;\n}\n\n/**\n * Throwing wrapper for config validation + the issue-#43 re-point gate:\n * throws `HostPolicyDeniedError` (`HOST_POLICY_DENIED`, category \"policy\",\n * `retryable: false`) naming the offending origin, else returns the origin.\n */\nexport function assertHostPolicy(origin: string, options: HostPolicyDecisionOptions): string {\n const violation = decideHostPolicy(origin, options);\n if (violation === null) return canonicalOrigin(origin);\n const bound =\n violation.bound === 'private'\n ? 'the host is a literal private / loopback / link-local address'\n : 'the host is not on the configured allowedOrigins list';\n throw new HostPolicyDeniedError(\n `Host policy denied \"${violation.origin}\": ${bound} (hostPolicy is opt-in; remove the bound or use a permitted origin)`,\n { details: { bound: violation.bound, origin: violation.origin } },\n );\n}\n","/**\n * Configuration, zone catalog and fail-closed validation (ARCHITECTURE section 6).\n *\n * Validation runs in the `AutotaskClient` constructor — fail closed, before any\n * request. Exactly ONE of `baseUrl` / `zone` is effective (`zone: 'other'`\n * requires `baseUrl`); credentials are required and non-empty after trim;\n * `pageSize` is an integer in 1..500 (vendor max, default 10). No zone logic\n * leaks into resources — they see one resolved base URL.\n */\nimport { ReadCache } from './cache.js';\nimport { CACHE_TTL_DEFAULT_MS, CACHE_TTL_REFERENCE_MS, DEFAULT_PER_RESOURCE_TTL_MS } from './cache-ttl-tables.js';\nimport { CREDENTIAL_ENV_LOAD_ACTION, credentialShapeProblem } from './credential-shape.js';\nimport { FIELD_CACHE_MAX_ENTITIES, FieldCache } from './fieldCache.js';\nimport { RESOURCE_NAME_CACHE_MAX_ENTRIES, ResourceNameCache } from './resourceNameCache.js';\nimport {\n DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD,\n DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS,\n DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE,\n DEFAULT_CIRCUIT_BREAKER_WINDOW_MS,\n type CircuitBreakerStore,\n} from './circuit-breaker.js';\nimport { DEFAULT_COOLDOWN_DEFAULT_MS, DEFAULT_COOLDOWN_MAX_MS, type CooldownStore } from './cooldown.js';\nimport { AutotaskConfigError, type AutotaskError } from './errors.js';\nimport { assertHostPolicy, normalizeAllowedOrigins } from './host-policy.js';\nimport { NoopLogger, type Logger } from './logger.js';\n\n/** The 23 named zones (catalog pinned from the node credential definition, G1 api-behavior section 2). */\nexport type ZoneName =\n | 'pre-release' | 'pre-release-uk' | 'limited-release' | 'limited-release-uk'\n | 'america-east' | 'america-east-2' | 'america-east-3'\n | 'america-west' | 'america-west-2' | 'america-west-3' | 'america-west-4'\n | 'uk' | 'uk2' | 'uk3'\n | 'old-australian' // default — webservices6\n | 'australia-nz' | 'australia-2'\n | 'pre-release-de' | 'pre-release-es'\n | 'german' | 'eu1' | 'spanish'\n | 'other'; // custom baseUrl required\n\n/**\n * Zone catalog: zone name -> base URL including the `/atservicesrest` version\n * path (lowercase on every zone). `other` has no catalog URL — a user-supplied\n * `baseUrl` is required.\n */\nexport const ZONE_CATALOG: Readonly<Record<ZoneName, string | null>> = {\n 'pre-release': 'https://webservices2.autotask.net/atservicesrest',\n 'pre-release-uk': 'https://webservices11.autotask.net/atservicesrest',\n 'limited-release': 'https://webservices1.autotask.net/atservicesrest',\n 'limited-release-uk': 'https://webservices17.autotask.net/atservicesrest',\n 'america-east': 'https://webservices3.autotask.net/atservicesrest',\n 'america-east-2': 'https://webservices14.autotask.net/atservicesrest',\n 'america-east-3': 'https://webservices22.autotask.net/atservicesrest',\n 'america-west': 'https://webservices5.autotask.net/atservicesrest',\n 'america-west-2': 'https://webservices15.autotask.net/atservicesrest',\n 'america-west-3': 'https://webservices24.autotask.net/atservicesrest',\n 'america-west-4': 'https://webservices25.autotask.net/atservicesrest',\n 'uk': 'https://webservices4.autotask.net/atservicesrest',\n 'uk2': 'https://webservices16.autotask.net/atservicesrest',\n 'uk3': 'https://webservices28.autotask.net/atservicesrest',\n 'old-australian': 'https://webservices6.autotask.net/atservicesrest',\n 'australia-nz': 'https://webservices29.autotask.net/atservicesrest',\n 'australia-2': 'https://webservices26.autotask.net/atservicesrest',\n 'pre-release-de': 'https://prde.autotask.net/atservicesrest',\n 'pre-release-es': 'https://pres.autotask.net/atservicesrest',\n 'german': 'https://webservices18.autotask.net/atservicesrest',\n 'eu1': 'https://webservices19.autotask.net/atservicesrest',\n 'spanish': 'https://webservices12.autotask.net/atservicesrest',\n 'other': null,\n};\n\n/** All zone names, in catalog order (includes `'other'`). */\nexport const ZONES: readonly ZoneName[] = [\n 'pre-release', 'pre-release-uk', 'limited-release', 'limited-release-uk',\n 'america-east', 'america-east-2', 'america-east-3',\n 'america-west', 'america-west-2', 'america-west-3', 'america-west-4',\n 'uk', 'uk2', 'uk3',\n 'old-australian',\n 'australia-nz', 'australia-2',\n 'pre-release-de', 'pre-release-es',\n 'german', 'eu1', 'spanish',\n 'other',\n];\n\n/** Default zone — 'old-australian' (webservices6). */\nexport const DEFAULT_ZONE: ZoneName = 'old-australian';\n\n/** The named config profiles (issue #4). `library` is the default and changes nothing. */\nexport type ConfigProfile = 'library' | 'agent';\n\n/**\n * Conservative limits for LLM-driven (agent) workloads (issue #4) — plain\n * data, exported for inspection and pinning. A looping agent can use up the\n * tenant's ~10,000 req/hour vendor budget, hold all 10 concurrent threads\n * (starving other integrations), and every retry spends budget, because the\n * limiter counts each attempt. The hourly limit is 80% of the vendor cap —\n * 2,000/hr stay available for the other integrations on the tenant.\n *\n * Resolution order: EXPLICIT config > profile > library default (the\n * existing validation runs on the final values). In agent mode the page size\n * is additionally CAPPED at `maxPageSize` (an explicit value above the cap\n * is clamped, not rejected).\n */\nexport const AGENT_PROFILE = {\n /** 80% of the 10,000/hr vendor cap. */\n rateLimit: { perHour: 8_000 },\n /** Default page size in agent mode. */\n pageSize: 25,\n /** Agent-mode page-size cap (explicit values above it are clamped). */\n maxPageSize: 100,\n timeoutMs: 20_000,\n maxRetries: 1,\n maxConcurrent: 3,\n /** 4 MiB — an agent should not pull a 64 MiB body. */\n maxResponseBytes: 4 * 1024 * 1024,\n resolution: { maxScanRecords: 200, maxScanPages: 2 },\n} as const;\n\nexport const DEFAULT_PAGE_SIZE = 10;\nexport const MAX_PAGE_SIZE = 500;\nexport const DEFAULT_TIMEOUT_MS = 30_000;\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_MAX_CONCURRENT = 10;\n/** Default response-size cap (64 MiB) — bounds a runaway/hostile body in memory. */\nexport const DEFAULT_MAX_RESPONSE_BYTES = 64 * 1024 * 1024;\n/** Bounded client-scan caps for resolution (section 19.2). */\nexport const DEFAULT_MAX_SCAN_RECORDS = 500;\nexport const DEFAULT_MAX_SCAN_PAGES = 4;\n/** Default read-cache TTL (issue #80: the plan-derived default class, 5 min). */\nexport const DEFAULT_READ_CACHE_TTL_MS = CACHE_TTL_DEFAULT_MS;\n/** Default field-metadata cache TTL (issue #80: the 5 min class). */\nexport const DEFAULT_FIELD_CACHE_TTL_MS = CACHE_TTL_DEFAULT_MS;\n/** Default resource-name cache TTL (issue #80: the plan-derived reference class, 1 h). */\nexport const DEFAULT_RESOURCE_NAME_CACHE_TTL_MS = CACHE_TTL_REFERENCE_MS;\n\nexport interface AutotaskConfig {\n /**\n * Config profile (issue #4): `'library'` (default — changes nothing) or\n * `'agent'` (the conservative AGENT_PROFILE limits for LLM-driven\n * workloads). Resolution order: explicit config > profile > library\n * default; the existing validation runs on the final values.\n */\n profile?: ConfigProfile;\n /**\n * Full base URL incl. version path, e.g. 'https://webservices6.autotask.net/atservicesrest'.\n * Origin+path only — no entity path, no trailing slash. Exactly one of baseUrl/zone.\n */\n baseUrl?: string;\n /** Named zone from the catalog (default 'old-australian' = webservices6). */\n zone?: ZoneName;\n /** Autotask API integration code (header ApiIntegrationCode). Required. */\n apiIntegrationCode: string;\n /** Autotask username (header UserName). Required. */\n userName: string;\n /** Autotask secret (header Secret). Required. */\n secret: string;\n /** Optional ImpersonationResourceId header value (sent on every request when set). */\n impersonationResourceId?: string;\n /** Default page size for query walks. Default 10, must be 1..500. */\n pageSize?: number;\n /** HTTP timeout in ms (whole-call budget). Default 30_000. */\n timeoutMs?: number;\n /** Retry budget for idempotent requests on 429/5xx. Default 3 (0 disables). */\n maxRetries?: number;\n /** Optional request log sink. Default: no-op. */\n logger?: Logger;\n /** Concurrency guard (API allows <=10 concurrent). Default 10. */\n maxConcurrent?: number;\n /** Largest response body the transport will read, in bytes. Default 64 MiB; larger responses throw `RESPONSE_TOO_LARGE`. */\n maxResponseBytes?: number;\n /**\n * Opt-in client-side hourly limiter (API allows 10,000 req/hour): waits\n * within the call deadline, else throws `RateLimitError`. Off by default\n * (the `agent` profile turns it on at AGENT_PROFILE.rateLimit.perHour).\n * `perHour: null` is the explicit \"disabled\" value — the only way to beat\n * a profile's value (an ABSENT perHour means \"use the profile/default\").\n */\n rateLimit?: { perHour?: number | null };\n /**\n * Per-tenant 429 cooldown gate (issue #6): ON by default. After a 429\n * exhausts the transport's retries (or carries a Retry-After we will not\n * wait out, on a non-retriable method), further calls for that tenant\n * (lowercased username + lowercased host) fail LOCALLY with\n * `RateLimitError` (`code: 'RATE_LIMITED_COOLDOWN'`, `notSent: true`)\n * until the deadline passes — zero upstream calls. `enabled: false`\n * disables the gate; `maxMs` caps the window (default 15 minutes);\n * `defaultMs` is the window when Retry-After is missing/unparseable\n * (default 60 s); `store` injects a custom `CooldownStore` (the default\n * is the in-process in-memory map shared by every client instance).\n */\n cooldown?: { enabled?: boolean; maxMs?: number; defaultMs?: number; store?: CooldownStore };\n /**\n * Optional per-host circuit breaker at the transport (issue #26): OFF by\n * default. Counts SERVICE-FAILURE outcomes per host (the host of the\n * base URL — a zone outage hits every tenant on that zone, so the key is\n * host-only; a different tenant on a different host is unaffected, and\n * on a shared host one tenant's outage opens the circuit for the others\n * — the documented consequence of the host-only key) and, once\n * `failureThreshold` counted failures land inside the `failureWindowMs`\n * window, refuses further calls for that host LOCALLY (`CircuitBreakerError`,\n * `code: 'CIRCUIT_BREAKER_OPEN'`, `notSent: true`, `retryable: true`,\n * `retryAfter` = remaining open seconds — the deliberate divergence from\n * #6's `retryable: false`: the open period is bounded and advertised)\n * until `openTimeoutMs` passes and `successesToClose` probe successes\n * close it. `halfOpenProbes` bounds the probes admitted while half-open\n * (default `= successesToClose`; MUST be `>= successesToClose` — a\n * breaker that can never close is refused fail-closed at construction).\n * `store` injects a custom `CircuitBreakerStore` (the default is the\n * in-process in-memory map shared by every client instance); `isFailure`\n * injects the failure predicate (the default counts NETWORK_ERROR,\n * TIMEOUT, a vendor 429, a 5xx EXCEPT the deterministic validation 500,\n * and UNEXPECTED_CONTENT_TYPE — never ABORTED, a 4xx, or a local\n * refusal). Gated calls emit the audit event with `notSent` and consume\n * no `rateLimit.perHour` stamp; `thresholdInformation.get()` bypasses the\n * refusal (its outcome is still recorded). Timer-free: everything is\n * derived from `Date.now()` lazily, like the #6 cooldown.\n */\n circuitBreaker?: {\n enabled?: boolean;\n failureWindowMs?: number;\n failureThreshold?: number;\n openTimeoutMs?: number;\n successesToClose?: number;\n halfOpenProbes?: number;\n store?: CircuitBreakerStore;\n isFailure?: (err: AutotaskError) => boolean;\n };\n /**\n * Bounded client-scan for resolution (section 19.2). A bare-value\n * `resolve` miss is answered by the server filter (zero items = no match,\n * null). `scanOnMiss: true` opts in to re-checking a miss with a bounded\n * unfiltered walk (exact match on the searchFields); a cap-tripped scan\n * throws RESOLUTION_TRUNCATED. Default false: the vendor gives no signal\n * that a filtered miss is incomplete (`pageDetails.requestCount` echoes\n * MaxRecords, it is not a match count). Caps default 500 records /\n * 4 pages; each must be an integer >= 1.\n */\n resolution?: { maxScanRecords?: number; maxScanPages?: number; scanOnMiss?: boolean };\n /**\n * Optional audit hook (section 19.3): one event per completed request,\n * carrying the correlation id, method, path, status, duration and the\n * redacted request body. Never called before the request settles.\n */\n onAudit?: (event: import('./types/common.js').AuditEvent) => void;\n /**\n * Response redaction for personal + business-sensitive field values\n * (default `true` = redacted). Setting `false` returns PII and\n * confidential fields (emails, phones, addresses, device IP/MAC, tax ids)\n * UNREDACTED to the caller — for regulated workflows that need raw\n * personal data and keep model transcripts inside your control. The\n * SECRET class (`password`, `secretKey`, `secret`) is ALWAYS redacted\n * regardless of this flag: the SDK is the only permission boundary (the\n * vendor API has no read-only key), so credential values never cross the\n * SDK boundary in a response. Request bodies are never redacted\n * (credentials travel in writes by design). See docs/API.md section 10.\n */\n redactPersonalData?: boolean;\n /**\n * Read-through TTL cache for successful single-record reads (get-by-id\n * and the id branch of `resolve`). ON by default (issue #80): an ABSENT\n * block builds the default instance (`DEFAULT_READ_CACHE_TTL_MS` — 5\n * min — with the plan-derived per-resource table\n * `DEFAULT_PER_RESOURCE_TTL_MS` applied as the default map); `cache:\n * false` is the explicit opt-out (no instance — the uncached path,\n * byte-identical to the pre-#80 off mode); an object merges over the\n * defaults (`ttlMs` optional). A cached read is a snapshot at fetch\n * time: mutations are never cached, and any real write through this\n * client clears the cache, so a write-then-read on the same client\n * re-fetches; writes made elsewhere (another client, the Autotask UI)\n * show up once the TTL expires. `ttlMs` must be a positive integer (ms)\n * when present. `perResourceTtlMs` (issue #32) is an optional map of\n * resource plan key -> TTL in ms whose entries OVERRIDE the default\n * table per resource (operator entry > table entry > `ttlMs`); a\n * resource named in neither falls back to `ttlMs`. Every value is a\n * positive integer (validated fail-closed like `ttlMs`). The key\n * contract (docs section 11.15): the entry takes the override for the\n * plan key of the entity the read path points to — a contact read\n * through `tickets.getContext` expires on the contact's TTL. The\n * plan-derived default table (`DEFAULT_PER_RESOURCE_TTL_MS` in\n * `src/cache-ttl-tables.ts`, reference class 1h vs default class 5min)\n * IS the default per-resource map (issue #80 — applied by default, not\n * just a reference).\n */\n cache?: false | { ttlMs?: number; perResourceTtlMs?: Record<string, number> };\n /**\n * Live field-metadata channel for the entityInformation trio\n * (`getEntityInfo` / `getFieldInfo` / `getUdfInfo`). ON by default\n * (issue #80): an ABSENT block builds the default instance\n * (`DEFAULT_FIELD_CACHE_TTL_MS` — 5 min — with `FIELD_CACHE_MAX_ENTITIES`);\n * `fieldCache: false` is the explicit opt-out (no instance — the trio\n * is the uncached wire path, bit-for-bit); an object merges over the\n * defaults. Live reads are snapshots at fetch time: a vendor drift (a\n * deterministic validation 500, or an INVALID_RESPONSE on a metadata\n * read) invalidates the entity's entries so the next call refetches;\n * anything the drift signals do not name shows up once `ttlMs` expires.\n * Field metadata only — record reads are `cache`, a different channel.\n * `ttlMs` must be a positive integer (ms) when present; `maxEntities`\n * (optional, positive integer) bounds the in-memory store.\n */\n fieldCache?: false | { ttlMs?: number; maxEntities?: number };\n /**\n * Resource-name channel for `operations.expandResourceNames` (issue\n * #65). ON by default (issue #80): an ABSENT block builds the default\n * instance (`DEFAULT_RESOURCE_NAME_CACHE_TTL_MS` — 1 h — with\n * `RESOURCE_NAME_CACHE_MAX_ENTRIES`); `resourceNameCache: false` is\n * the explicit opt-out (no instance, and the op is the uncached per-id\n * path, bit-for-bit — per-call de-duplication still applies); an\n * object merges over the defaults. Stores the op's name projection per\n * resource id (a resolved name, or the vendor's true not-found as a\n * blind marker — a repeat miss costs no wire); failures are never\n * cached. Live names are snapshots at fetch time: a `resources` write\n * through the same client clears the channel; a rename made elsewhere\n * shows up once `ttlMs` expires. `ttlMs` must be a positive integer\n * (ms) when present; `maxEntries` (optional, positive integer) bounds\n * the in-memory store.\n */\n resourceNameCache?: false | { ttlMs?: number; maxEntries?: number };\n /**\n * Opt-in PUT item-path fallback for updates (issue #34). OFF by default\n * (absent = the spec-derived route contract is unchanged: a 404 on the\n * pinned update route surfaces the typed error). With `putFallback: true`,\n * a TYPED 404 on a NON-collectionUpdate update route (the scoped\n * collection PATCH; the top-level item-path PUT) retries ONCE as\n * `PUT /{Entity}/{id}` — the retry body is the caller's fields merged onto\n * a fresh unredacted read of the current record, so a fallback PUT is\n * never a null-clearing partial. Never retried: 400/405/422/5xx,\n * collectionUpdate routes (the spec defines no item-path update there) and\n * `raw: true` updates (the raw path issues exactly what it was told). A\n * declined gate throws the self-explaining typed error naming the route,\n * the status and the opt-in (`details.putFallback`).\n */\n update?: { putFallback?: boolean };\n /**\n * Opt-in zone re-resolution on 401 (issue #43). OFF by default (absent or\n * not exactly `true` = today's behaviour byte-identically: a 401 surfaces\n * the typed `UnauthorizedError` with no discovery call and no second\n * request). With `reResolveZoneOn401: true`, a 401 on a RELATIVE path\n * against a CATALOG base (an explicit `baseUrl` is never re-pointed — the\n * operator said where to go) makes ONE unauthenticated vendor\n * zone-discovery call\n * (`GET https://webservices.autotask.net/atservicesrest/v1.0/zoneInformation?user=<userName>`);\n * the response's `url` is the ONLY accepted re-point target (a 401\n * body-injected URL never receives the credentials). If the resolved zone\n * base DIFFERS from the client's live base: the client re-points its live\n * base URL (process-lifetime — never persisted) and retries the SAME\n * request ONCE against it; the re-pointed host starts with fresh per-host\n * transport state (no cooldown/breaker inheritance from the stale host).\n * A resolved base identical to the live one, or a discovery fault\n * (network / non-200 / malformed / missing `url`), propagates today's\n * typed 401 untouched (zero retry — the recovery must not turn a\n * credential fault into a discovery fault). A retry that 401s again\n * propagates the typed `UnauthorizedError` with\n * `details.zoneRecovery = { from, to, retried: true }`. See docs/API.md\n * section 11.19.\n */\n reResolveZoneOn401?: boolean;\n /**\n * Opt-in config-time HOST BOUNDS (skill 3.5.0 / L2, finding A1): OFF by\n * default — an absent block leaves the resolved config byte-identical\n * (no bound runs). When present, the RESOLVED base URL (explicit\n * `baseUrl` or zone-derived) must pass every ACTIVE bound at\n * construction time, before any wire activity; a violation throws\n * `HostPolicyDeniedError` (`code: 'HOST_POLICY_DENIED'`, category\n * \"policy\", `retryable: false`) naming the offending origin. With the\n * issue-#43 zone recovery enabled, the same bounds gate the\n * discovery-provided re-point target — a refused host is a discovery\n * fault (the original 401 propagates byte-identically, zero wire to the\n * refused host).\n *\n * `blockPrivateHosts` refuses a LITERAL private / loopback / link-local\n * host (IPv4 10/8, 172.16/12, 192.168/16, 127/8, 169.254/16, 0/8;\n * IPv6 ::1, fc00::/7, fe80::/10, and IPv4-mapped `::ffff:a.b.c.d`).\n * Checks run on the canonical `new URL(origin).host`; HOSTNAMES are\n * never blocked — there are no DNS lookups, so the bound sees literal\n * IPs only. `allowedOrigins` is an EXACT normalised-origin allow-list\n * (scheme + host[:port] — entries are canonicalised with the same WHATWG\n * origin rules, so `https://api.example.com:443` matches\n * `https://api.example.com`). The private bound is checked FIRST and\n * wins: a host that is both private and allow-listed is still refused.\n * FAIL-CLOSED: a PRESENT block with NO active bound (neither\n * `blockPrivateHosts: true` nor a non-empty `allowedOrigins`) is refused\n * at config validation — an empty policy would silently read as\n * \"unbounded\".\n */\n hostPolicy?: { blockPrivateHosts?: boolean; allowedOrigins?: readonly string[] };\n}\n\n/** Resolved + validated config; every field final (no optional numbers left). */\nexport interface ResolvedAutotaskConfig {\n /** The effective profile (resolved; `'library'` when absent). */\n profile: ConfigProfile;\n /** Resolved base URL (no trailing slash). */\n baseUrl: string;\n /** The named zone, when one was used (undefined for a bare explicit baseUrl). */\n zone?: ZoneName;\n apiIntegrationCode: string;\n userName: string;\n secret: string;\n impersonationResourceId?: string;\n pageSize: number;\n timeoutMs: number;\n maxRetries: number;\n maxConcurrent: number;\n maxResponseBytes: number;\n logger: Logger;\n rateLimit?: { perHour: number };\n /** Resolved tenant 429 cooldown gate (final values; ON by default). */\n cooldown: { enabled: boolean; maxMs: number; defaultMs: number; store?: CooldownStore };\n /**\n * Resolved per-host circuit breaker (final values; OFF by default). When\n * `enabled` is false the transport keeps no breaker state at all.\n */\n circuitBreaker: {\n enabled: boolean;\n failureWindowMs: number;\n failureThreshold: number;\n openTimeoutMs: number;\n successesToClose: number;\n halfOpenProbes: number;\n store?: CircuitBreakerStore;\n isFailure?: (err: AutotaskError) => boolean;\n };\n /** Resolved scan caps (final values; defaults 500 records / 4 pages; scanOnMiss default false). */\n resolution: { maxScanRecords: number; maxScanPages: number; scanOnMiss: boolean };\n /** Audit hook (absent when the caller provided none). */\n onAudit?: (event: import('./types/common.js').AuditEvent) => void;\n /** Response redaction for PII + CONFIDENTIAL fields (resolved; default true). */\n redactPersonalData: boolean;\n /** The read cache (the default instance when `cache` is absent; absent only for explicit `cache: false`, issue #80). */\n readCache?: ReadCache;\n /** The field-metadata cache (the default instance when `fieldCache` is absent; absent only for explicit `fieldCache: false`, issue #80). */\n fieldCache?: FieldCache;\n /** The resource-name cache (the default instance when `resourceNameCache` is absent; absent only for explicit `resourceNameCache: false`, issue #65). */\n resourceNameCache?: ResourceNameCache;\n /** Resolved update fallback gate (final value; OFF by default, issue #34). */\n update: { putFallback: boolean };\n /** Resolved zone re-resolution gate (final value; OFF by default, issue #43). */\n reResolveZoneOn401: boolean;\n /**\n * Resolved host bounds (absent when the opt-in block was not supplied —\n * byte-identical default; skill 3.5.0 / L2, finding A1). `blockPrivate`\n * and `allowedOrigins` are the ACTIVE bounds only (an absent boolean /\n * empty list means that bound is inactive); consumers then gate the\n * construction-time base AND the issue-#43 re-point target through them.\n */\n hostPolicy?: { blockPrivate: boolean; allowedOrigins: readonly string[] };\n}\n\n/** Catalog URL for a named zone. Throws `AutotaskConfigError` for `'other'`. */\nexport function zoneUrl(zone: ZoneName): string {\n const url = ZONE_CATALOG[zone];\n if (url === null || url === undefined) {\n throw new AutotaskConfigError(`Zone \"${zone}\" has no catalog URL; supply a baseUrl instead`);\n }\n return url;\n}\n\n/** Validate a baseUrl: http/https only, trailing slashes stripped. */\nfunction normalizeBaseUrl(raw: string): string {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new AutotaskConfigError(`Invalid baseUrl: \"${raw}\"`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new AutotaskConfigError(`baseUrl must use http: or https:, got \"${url.protocol}\"`);\n }\n const path = url.pathname.replace(/\\/+$/, '');\n return `${url.origin}${path}`;\n}\n\nfunction isKnownZone(zone: unknown): zone is ZoneName {\n return typeof zone === 'string' && (ZONES as readonly string[]).includes(zone);\n}\n\n/**\n * `baseUrl ?? zoneUrl(zone ?? 'old-australian')` — one resolved base URL for\n * the whole client (no zone logic leaks into resources).\n */\nexport function resolveBaseUrl(partial: { baseUrl?: string; zone?: ZoneName }): string {\n if (partial.baseUrl !== undefined) return normalizeBaseUrl(partial.baseUrl);\n if (partial.zone === 'other') {\n throw new AutotaskConfigError('zone: \"other\" requires a baseUrl');\n }\n return zoneUrl(partial.zone ?? DEFAULT_ZONE);\n}\n\n/** A required credential: a string, non-empty after trim. */\nfunction requireCredential(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new AutotaskConfigError(`${field} must be a non-empty string`);\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new AutotaskConfigError(`${field} must be a non-empty string`);\n }\n // C1 credential shape gate (2026-10-07 incident class): the TRIMMED value is checked before it\n // is accepted, so a value that is contaminated rather than merely padded is REFUSED instead of\n // silently normalized. Edge whitespace alone keeps its historical behaviour (the trim pinned by\n // test/config.test.ts); a surrounding quote (the single-quoted `.env` trap) or an interior CR is\n // a load defect no trim can repair, and sending it produces an opaque vendor 401. Value-free:\n // the error names the field and the env-load pitfall, never the value.\n const shape = credentialShapeProblem(trimmed, { skipEdgeWhitespace: true });\n if (shape !== undefined) {\n throw new AutotaskConfigError(`${field} ${CREDENTIAL_ENV_LOAD_ACTION} (${shape})`, {\n code: 'INVALID_CREDENTIAL_SHAPE',\n suggestedAction:\n 'Load the credential with the shell (`set -a; . ./.env; set +a`) or with ' +\n 'loadAutotaskCredentialsFromEnv() from node-autotask; single-quoted values must be ' +\n 'shell-sourced, not parsed by a quote-preserving loader. No request was sent.',\n });\n }\n return trimmed;\n}\n\n/**\n * The credential core of `resolveConfig` (issue #80): the fail-closed\n * credential trim + zone -> base-URL resolution WITHOUT building the\n * cache instances. `ClientPool.keyFor` calls this to hash the credential\n * tuple — with the channels default-on, the full `resolveConfig` would\n * construct three throwaway cache instances on every pool access, so the\n * key path must not (the pool key ignores cache config by design: same\n * credentials = one client, first-built wins). `resolveConfig` reuses\n * this for the same fields, then resolves the rest.\n */\nexport function resolveCredentials(\n config: AutotaskConfig,\n): {\n baseUrl: string;\n zone?: ZoneName;\n apiIntegrationCode: string;\n userName: string;\n secret: string;\n impersonationResourceId?: string;\n} {\n if (config === null || typeof config !== 'object') {\n throw new AutotaskConfigError('AutotaskConfig is required');\n }\n const { baseUrl, zone } = config;\n // Exactly one of baseUrl/zone is effective; zone 'other' takes a baseUrl.\n if (baseUrl !== undefined && zone !== undefined && zone !== 'other') {\n throw new AutotaskConfigError(\n 'Provide exactly one of \"baseUrl\" or \"zone\" (zone \"other\" is used with a baseUrl)',\n );\n }\n let resolvedBaseUrl: string;\n let resolvedZone: ZoneName | undefined;\n if (baseUrl !== undefined) {\n resolvedBaseUrl = normalizeBaseUrl(baseUrl);\n if (zone === 'other') resolvedZone = 'other';\n } else if (zone !== undefined) {\n if (!isKnownZone(zone)) {\n // F10: name the bad zone AND list the 23 catalog zones — a 9am zone\n // typo is the #1 live-run trap, and the fix is in the message.\n throw new AutotaskConfigError(\n `Unknown zone \"${zone}\" — the catalog has ${ZONES.length} zones: ${ZONES.join(', ')} (use one of them, or supply a baseUrl)`,\n );\n }\n if (zone === 'other') {\n throw new AutotaskConfigError('zone: \"other\" requires a baseUrl');\n }\n resolvedBaseUrl = zoneUrl(zone);\n resolvedZone = zone;\n } else {\n resolvedBaseUrl = zoneUrl(DEFAULT_ZONE);\n resolvedZone = DEFAULT_ZONE;\n }\n const apiIntegrationCode = requireCredential(config.apiIntegrationCode, 'apiIntegrationCode');\n const userName = requireCredential(config.userName, 'userName');\n const secret = requireCredential(config.secret, 'secret');\n let impersonationResourceId: string | undefined;\n if (config.impersonationResourceId !== undefined) {\n impersonationResourceId = requireCredential(config.impersonationResourceId, 'impersonationResourceId');\n }\n return { baseUrl: resolvedBaseUrl, zone: resolvedZone, apiIntegrationCode, userName, secret, impersonationResourceId };\n}\n\n/** Validate + resolve an AutotaskConfig (fail closed; throws AutotaskConfigError). */\nexport function resolveConfig(config: AutotaskConfig): ResolvedAutotaskConfig {\n if (config === null || typeof config !== 'object') {\n throw new AutotaskConfigError('AutotaskConfig is required');\n }\n // Profile (issue #4): 'library' is the default and changes nothing;\n // 'agent' applies the conservative AGENT_PROFILE values wherever the\n // caller left a field unset. Fail closed on anything else.\n const profile = config.profile ?? 'library';\n if (profile !== 'library' && profile !== 'agent') {\n throw new AutotaskConfigError(\n `Unknown profile \"${String(config.profile)}\" — expected \"library\" or \"agent\"`,\n );\n }\n const agent = profile === 'agent';\n\n // Issue #80: the credential core (trim + zone -> base URL) — the same\n // helper `ClientPool.keyFor` calls WITHOUT the cache construction, so a\n // zone and the equivalent base URL hash identically in the pool key.\n const {\n baseUrl: resolvedBaseUrl,\n zone: resolvedZone,\n apiIntegrationCode,\n userName,\n secret,\n impersonationResourceId,\n } = resolveCredentials(config);\n\n // Skill 3.5.0 / L2 (finding A1): the opt-in host bounds, FAIL-CLOSED.\n // Absent block => untouched behaviour (byte-identical default). A PRESENT\n // block must carry at least one active bound (an empty policy would read\n // as \"unbounded\"), and the RESOLVED base URL — explicit or zone-derived —\n // must pass it here, before any wire activity.\n let hostPolicy: { blockPrivate: boolean; allowedOrigins: readonly string[] } | undefined;\n if (config.hostPolicy !== undefined) {\n const raw = config.hostPolicy as { blockPrivateHosts?: unknown; allowedOrigins?: unknown };\n if (raw === null || typeof raw !== 'object') {\n throw new AutotaskConfigError('hostPolicy must be an object');\n }\n if (raw.blockPrivateHosts !== undefined && typeof raw.blockPrivateHosts !== 'boolean') {\n throw new AutotaskConfigError('hostPolicy.blockPrivateHosts must be a boolean');\n }\n let allowedOrigins: string[] | undefined;\n if (raw.allowedOrigins !== undefined) {\n if (!Array.isArray(raw.allowedOrigins) || raw.allowedOrigins.some((entry) => typeof entry !== 'string')) {\n throw new AutotaskConfigError('hostPolicy.allowedOrigins must be an array of URL strings');\n }\n try {\n allowedOrigins = normalizeAllowedOrigins(raw.allowedOrigins);\n } catch {\n throw new AutotaskConfigError('hostPolicy.allowedOrigins contains an invalid URL');\n }\n }\n const blockPrivate = raw.blockPrivateHosts === true;\n if (!blockPrivate && (allowedOrigins === undefined || allowedOrigins.length === 0)) {\n throw new AutotaskConfigError(\n 'hostPolicy is present but has no active bound — set blockPrivateHosts: true and/or a non-empty allowedOrigins (an empty policy is refused fail-closed)',\n );\n }\n hostPolicy = { blockPrivate, allowedOrigins: allowedOrigins ?? [] };\n // Throws HostPolicyDeniedError (typed config error) pre-wire; the\n // private bound is checked FIRST and wins over the allow-list. The\n // helper option names are the internal ones (`blockPrivate` /\n // `allowedOrigins`); the public config names stay `blockPrivateHosts`.\n assertHostPolicy(resolvedBaseUrl, {\n blockPrivate: hostPolicy.blockPrivate,\n allowedOrigins: hostPolicy.allowedOrigins,\n });\n }\n\n // Explicit config > profile > library default (issue #4): the profile\n // value applies only where the caller left the field UNSET.\n const pageSize = config.pageSize ?? (agent ? AGENT_PROFILE.pageSize : DEFAULT_PAGE_SIZE);\n if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > MAX_PAGE_SIZE) {\n throw new AutotaskConfigError(`pageSize must be an integer in 1..${MAX_PAGE_SIZE} (got ${String(config.pageSize)})`);\n }\n // Agent profile: the page size is CAPPED — an explicit value above the cap\n // is clamped (not rejected); library mode is uncapped (vendor max).\n const pageSizeCapped = agent ? Math.min(pageSize, AGENT_PROFILE.maxPageSize) : pageSize;\n\n const timeoutMs = config.timeoutMs ?? (agent ? AGENT_PROFILE.timeoutMs : DEFAULT_TIMEOUT_MS);\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new AutotaskConfigError('timeoutMs must be a positive integer');\n }\n\n const maxRetries = config.maxRetries ?? (agent ? AGENT_PROFILE.maxRetries : DEFAULT_MAX_RETRIES);\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n throw new AutotaskConfigError('maxRetries must be a non-negative integer');\n }\n\n const maxConcurrent = config.maxConcurrent ?? (agent ? AGENT_PROFILE.maxConcurrent : DEFAULT_MAX_CONCURRENT);\n if (!Number.isInteger(maxConcurrent) || maxConcurrent <= 0) {\n throw new AutotaskConfigError('maxConcurrent must be a positive integer');\n }\n\n const maxResponseBytes = config.maxResponseBytes ?? (agent ? AGENT_PROFILE.maxResponseBytes : DEFAULT_MAX_RESPONSE_BYTES);\n if (!Number.isInteger(maxResponseBytes) || maxResponseBytes <= 0) {\n throw new AutotaskConfigError('maxResponseBytes must be a positive integer');\n }\n\n let rateLimit: { perHour: number } | undefined;\n if (config.rateLimit !== undefined && config.rateLimit.perHour !== undefined) {\n if (config.rateLimit.perHour === null) {\n // Explicit disable (issue #4) — beats the profile's value. Absent\n // (undefined) would mean \"use the profile/default\" instead.\n rateLimit = undefined;\n } else {\n const perHour = config.rateLimit.perHour;\n if (!Number.isInteger(perHour) || perHour <= 0) {\n throw new AutotaskConfigError('rateLimit.perHour must be a positive integer or null (explicitly disabled)');\n }\n rateLimit = { perHour };\n }\n } else if (agent) {\n rateLimit = { perHour: AGENT_PROFILE.rateLimit.perHour };\n }\n\n // Tenant 429 cooldown gate (issue #6): ON by default with the 15-minute\n // hard cap; `enabled: false` disables it, `store` injects a custom one.\n const cooldownEnabled = config.cooldown?.enabled ?? true;\n const cooldownMaxMs = config.cooldown?.maxMs ?? DEFAULT_COOLDOWN_MAX_MS;\n if (!Number.isInteger(cooldownMaxMs) || cooldownMaxMs <= 0) {\n throw new AutotaskConfigError('cooldown.maxMs must be a positive integer (ms)');\n }\n const cooldownDefaultMs = config.cooldown?.defaultMs ?? DEFAULT_COOLDOWN_DEFAULT_MS;\n if (!Number.isInteger(cooldownDefaultMs) || cooldownDefaultMs <= 0) {\n throw new AutotaskConfigError('cooldown.defaultMs must be a positive integer (ms)');\n }\n const cooldownStore = config.cooldown?.store;\n if (\n cooldownStore !== undefined &&\n (typeof cooldownStore.get !== 'function' ||\n typeof cooldownStore.set !== 'function' ||\n typeof cooldownStore.delete !== 'function')\n ) {\n throw new AutotaskConfigError('cooldown.store must implement get/set/delete (a CooldownStore)');\n }\n const cooldown = {\n enabled: cooldownEnabled,\n maxMs: cooldownMaxMs,\n defaultMs: cooldownDefaultMs,\n store: cooldownStore,\n };\n\n // Per-host circuit breaker (issue #26): OFF by default (the #6 cooldown\n // is ON by default — an outage gate is opt-in, a 429 gate is not); the\n // same fail-closed validation style. No env overrides (src/config.ts\n // never reads process.env — the reference servers own env handling).\n const breakerEnabled = config.circuitBreaker?.enabled ?? false;\n const breakerWindowMs = config.circuitBreaker?.failureWindowMs ?? DEFAULT_CIRCUIT_BREAKER_WINDOW_MS;\n if (!Number.isInteger(breakerWindowMs) || breakerWindowMs <= 0) {\n throw new AutotaskConfigError('circuitBreaker.failureWindowMs must be a positive integer (ms)');\n }\n const breakerThreshold = config.circuitBreaker?.failureThreshold ?? DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD;\n if (!Number.isInteger(breakerThreshold) || breakerThreshold <= 0) {\n throw new AutotaskConfigError('circuitBreaker.failureThreshold must be a positive integer');\n }\n const breakerOpenTimeoutMs = config.circuitBreaker?.openTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS;\n if (!Number.isInteger(breakerOpenTimeoutMs) || breakerOpenTimeoutMs <= 0) {\n throw new AutotaskConfigError('circuitBreaker.openTimeoutMs must be a positive integer (ms)');\n }\n const breakerSuccessesToClose = config.circuitBreaker?.successesToClose ?? DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE;\n if (!Number.isInteger(breakerSuccessesToClose) || breakerSuccessesToClose <= 0) {\n throw new AutotaskConfigError('circuitBreaker.successesToClose must be a positive integer');\n }\n const breakerHalfOpenProbes = config.circuitBreaker?.halfOpenProbes ?? breakerSuccessesToClose;\n if (!Number.isInteger(breakerHalfOpenProbes) || breakerHalfOpenProbes <= 0) {\n throw new AutotaskConfigError('circuitBreaker.halfOpenProbes must be a positive integer');\n }\n // A breaker that can never close is a misconfiguration: with fewer\n // admitted probes than required successes the half-open phase ends\n // without ever reaching `successesToClose`.\n if (breakerHalfOpenProbes < breakerSuccessesToClose) {\n throw new AutotaskConfigError(\n `circuitBreaker.halfOpenProbes (${breakerHalfOpenProbes}) must be >= successesToClose (${breakerSuccessesToClose}) — the breaker could never close`,\n );\n }\n const breakerStore = config.circuitBreaker?.store;\n if (\n breakerStore !== undefined &&\n (typeof breakerStore.get !== 'function' ||\n typeof breakerStore.set !== 'function' ||\n typeof breakerStore.delete !== 'function')\n ) {\n throw new AutotaskConfigError('circuitBreaker.store must implement get/set/delete (a CircuitBreakerStore)');\n }\n const breakerIsFailure = config.circuitBreaker?.isFailure;\n if (breakerIsFailure !== undefined && typeof breakerIsFailure !== 'function') {\n throw new AutotaskConfigError('circuitBreaker.isFailure must be a function');\n }\n const circuitBreaker = {\n enabled: breakerEnabled,\n failureWindowMs: breakerWindowMs,\n failureThreshold: breakerThreshold,\n openTimeoutMs: breakerOpenTimeoutMs,\n successesToClose: breakerSuccessesToClose,\n halfOpenProbes: breakerHalfOpenProbes,\n store: breakerStore,\n isFailure: breakerIsFailure,\n };\n\n const maxScanRecords = config.resolution?.maxScanRecords ?? (agent ? AGENT_PROFILE.resolution.maxScanRecords : DEFAULT_MAX_SCAN_RECORDS);\n if (!Number.isInteger(maxScanRecords) || maxScanRecords < 1) {\n throw new AutotaskConfigError('resolution.maxScanRecords must be an integer >= 1');\n }\n const maxScanPages = config.resolution?.maxScanPages ?? (agent ? AGENT_PROFILE.resolution.maxScanPages : DEFAULT_MAX_SCAN_PAGES);\n if (!Number.isInteger(maxScanPages) || maxScanPages < 1) {\n throw new AutotaskConfigError('resolution.maxScanPages must be an integer >= 1');\n }\n const scanOnMiss = config.resolution?.scanOnMiss === undefined ? false : config.resolution.scanOnMiss;\n if (typeof scanOnMiss !== 'boolean') {\n throw new AutotaskConfigError('resolution.scanOnMiss must be a boolean');\n }\n\n const redactPersonalData = config.redactPersonalData ?? true;\n // Issue #80: the cache channels are ON by default — an ABSENT block\n // builds the default instance; explicit `false` is the opt-out\n // (undefined instance = the pre-#80 uncached code paths, byte-identical);\n // an object merges over the defaults (the ttlMs fields become optional).\n // The plan-derived per-resource table is the DEFAULT map: operator\n // perResourceTtlMs entries override table entries; every table row the\n // operator did not name stands. The cache classes validate ttlMs +\n // bounds (positive integers) and throw AutotaskConfigError.\n const cacheBlock = config.cache === false || config.cache === undefined ? undefined : config.cache;\n const fieldCacheBlock = config.fieldCache === false || config.fieldCache === undefined ? undefined : config.fieldCache;\n const resourceNameCacheBlock =\n config.resourceNameCache === false || config.resourceNameCache === undefined\n ? undefined\n : config.resourceNameCache;\n const readCache =\n config.cache === false\n ? undefined\n : new ReadCache(\n cacheBlock?.ttlMs ?? DEFAULT_READ_CACHE_TTL_MS,\n { ...DEFAULT_PER_RESOURCE_TTL_MS, ...cacheBlock?.perResourceTtlMs },\n );\n const fieldCache =\n config.fieldCache === false\n ? undefined\n : new FieldCache(\n fieldCacheBlock?.ttlMs ?? DEFAULT_FIELD_CACHE_TTL_MS,\n fieldCacheBlock?.maxEntities ?? FIELD_CACHE_MAX_ENTITIES,\n );\n const resourceNameCache =\n config.resourceNameCache === false\n ? undefined\n : new ResourceNameCache(\n resourceNameCacheBlock?.ttlMs ?? DEFAULT_RESOURCE_NAME_CACHE_TTL_MS,\n resourceNameCacheBlock?.maxEntries ?? RESOURCE_NAME_CACHE_MAX_ENTRIES,\n );\n // Issue #34: the update fallback gate resolves to a strict boolean\n // (exactly `true` opts in; anything else — absent or not — stays off).\n const update = { putFallback: config.update?.putFallback === true };\n // Issue #43: the zone re-resolution gate resolves to a strict boolean the\n // same way (absent or not-exactly-true stays off — byte-identical to\n // today: no discovery call, no second request).\n const reResolveZoneOn401 = config.reResolveZoneOn401 === true;\n\n const logger = config.logger ?? NoopLogger;\n // G10b F3: a custom http: base URL sends the three auth headers cleartext\n // (all 23 catalog zones are https). One warning at construction — no\n // rejection (local test servers must keep working).\n if (resolvedBaseUrl.startsWith('http:')) {\n const host = new URL(resolvedBaseUrl).host;\n logger.warn?.(\n `[autotask] cleartext credentials to ${host} — https recommended (baseUrl uses http:; all catalog zones are https)`,\n );\n }\n\n return {\n profile,\n baseUrl: resolvedBaseUrl,\n zone: resolvedZone,\n apiIntegrationCode,\n userName,\n secret,\n impersonationResourceId,\n pageSize: pageSizeCapped,\n timeoutMs,\n maxRetries,\n maxConcurrent,\n maxResponseBytes,\n logger,\n rateLimit,\n cooldown,\n circuitBreaker,\n resolution: { maxScanRecords, maxScanPages, scanOnMiss },\n onAudit: config.onAudit,\n redactPersonalData,\n readCache,\n fieldCache,\n resourceNameCache,\n update,\n reResolveZoneOn401,\n hostPolicy,\n };\n}\n","/**\n * Small shared helpers (ARCHITECTURE section 15: zero runtime dependencies —\n * `node:crypto` is platform, not a dep).\n */\nimport { randomUUID } from 'node:crypto';\nimport { AutotaskConfigError, AutotaskError } from '../errors.js';\nimport type { Identifier } from '../types/common.js';\n\n/** Narrow unknown to a record (a plain object — not an array, not null). */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Narrow unknown to a record or throw `AutotaskError` (code INVALID_RESPONSE)\n * naming the expected shape.\n */\nexport function assertRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) {\n const got = value === null ? 'null' : Array.isArray(value) ? 'array' : typeof value;\n throw new AutotaskError(`Expected ${label} to be an object, got ${got}`, {\n code: 'INVALID_RESPONSE',\n category: 'server',\n retryable: false,\n });\n }\n return value;\n}\n\n/** A value eligible for recursive merge: plain object, not an array. */\nfunction isMergeable(value: unknown): value is Record<string, unknown> {\n return isRecord(value);\n}\n\n/**\n * Deep-merge plain-object params (override wins; plain objects merge\n * recursively, arrays and scalars are replaced wholesale). Neither input is\n * mutated.\n */\nexport function deepMergeParams<T extends Record<string, unknown>>(base: T, override: Partial<T>): T {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) continue;\n const baseValue = base[key];\n out[key] =\n isMergeable(baseValue) && isMergeable(value)\n ? deepMergeParams(baseValue, value)\n : value;\n }\n return out as T;\n}\n\n/**\n * True when the value is an id candidate: a number, or an all-digit string\n * (the wire-boundary shapes `parseIdentifier` decides on).\n */\nexport function isIdentifierCandidate(value: unknown): boolean {\n return typeof value === 'number' || (typeof value === 'string' && /^\\d+$/.test(value.trim()));\n}\n\n/**\n * Canonicalise an id for the addressable surface (number or numeric string).\n * A safe non-negative integer number stays a number; an all-digit string\n * whose trimmed digit string parses to a safe integer normalises to that\n * number (the trim canonicalises the padding and leading zeros drop:\n * ' 42 ' -> 42, '007' -> 7); an all-digit string BEYOND the safe range stays\n * a string (the trimmed canonical digits) — vendor ids above 2^53 are\n * addressable only via the string form: a JS number that big has already\n * lost precision and must never be re-parsed, while the string travels to\n * the URL path verbatim (losslessly).\n *\n * Throws `AutotaskConfigError` (CONFIG_ERROR) naming `label` for: unsafe or\n * negative numbers (corrupted or invalid), non-digit / non-integer strings\n * (floats, signs, exponents, blanks), null, and non-id values.\n */\nexport function parseIdentifier(value: unknown, label = 'id'): Identifier {\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new AutotaskConfigError(`${label} must be a non-negative safe integer (got ${value})`);\n }\n return value;\n }\n if (typeof value !== 'string') {\n // Wire-boundary guard: the invoke router forwards caller args untyped, so\n // a null / object / array arg must refuse with a typed CONFIG_ERROR (never\n // an uncaught TypeError from .trim()).\n const got = value === null ? 'null' : Array.isArray(value) ? 'array' : String(typeof value);\n throw new AutotaskConfigError(`${label} must be a non-negative integer or a canonical integer string (got ${got})`);\n }\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n throw new AutotaskConfigError(`${label} must be a non-negative integer (got \"${value}\")`);\n }\n const parsed = Number.parseInt(trimmed, 10);\n if (!Number.isSafeInteger(parsed)) return trimmed; // unsafe: keep the exact digits (string passthrough)\n return parsed;\n}\n\n/**\n * Hoist `userDefinedFields: [{ name, value }]` to the record top level\n * (collision-safe: a name that already exists on the record gets the prefix,\n * default `udf_`; the original array is preserved; existing properties are\n * never overwritten). Mirrors the node's `flattenUdfs` output.\n */\nexport function flattenUdfs<T extends Record<string, unknown>>(\n record: T,\n options?: { prefix?: string },\n): T & Record<string, unknown> {\n const prefix = options?.prefix ?? 'udf_';\n const out: Record<string, unknown> = { ...record };\n const udfs = record.userDefinedFields;\n if (!Array.isArray(udfs)) return out as T & Record<string, unknown>;\n for (const udf of udfs) {\n if (!isRecord(udf) || typeof udf.name !== 'string' || udf.name === '') continue;\n const target = udf.name in out ? `${prefix}${udf.name}` : udf.name;\n if (!(target in out)) out[target] = udf.value;\n }\n return out as T & Record<string, unknown>;\n}\n\n/** One correlation id per request (surfaced on every error and audit event). */\nexport function newCorrelationId(): string {\n return randomUUID();\n}\n\n/**\n * Redact credential-shaped fields in an audit payload (section 19.3): any\n * object key naming a secret/password/token/api-key/credential is replaced\n * with `'[REDACTED]'`; nested objects and arrays are walked recursively.\n * Values are never logged, only field NAMES matched.\n *\n * Two families (G10b F4 hardening):\n * - the G3 word set — separator-delimited (^, _, -, .) spellings of\n * secret(s)/password/passwd/passphrase/token(s)/apikey/api_key/\n * apiintegrationcode/credential(s)/accesskey/access_key/authcode/\n * authorization (matches `secret`, `access_key`, `user-secret`, and —\n * case-insensitively — the whole word `apiIntegrationCode`);\n * - camelCase composites — a key that ENDS in a credential suffix\n * (Secret/Token(s)/Password/Passphrase/Credential(s)/Key/\n * ApiIntegrationCode), e.g. `authToken`, `accessToken`, `mySecret`.\n * Deliberately excluded: a bare `Code` suffix (too broad — `statusCodes`-\n * shaped fields) and non-credential ids such as `impersonationResourceId`\n * (a numeric id, not a secret; the logger's name-based redactor,\n * CREDENTIAL_HEADER_NAMES, covers it on the log side).\n */\nconst CREDENTIAL_KEY_RE =\n /(^|[_\\-.])(secret|secrets|password|passwd|passphrase|token|tokens|apikey|api_key|apiintegrationcode|credentials?|accesskey|access_key|authcode|authorization)([_\\-.]|$)|([A-Za-z0-9])(secrets?|tokens?|password|passwd|passphrase|credentials?|keys?|apiintegrationcode)(?=$)/i;\n\nexport function redactAuditBody(value: unknown): unknown {\n if (Array.isArray(value)) return value.map((entry) => redactAuditBody(entry));\n if (!isRecord(value)) return value;\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n out[key] = CREDENTIAL_KEY_RE.test(key) ? '[REDACTED]' : redactAuditBody(entry);\n }\n return out;\n}\n\n/** A plan key (`configuration_items`) as a client accessor (`configurationItems`). */\nexport function camelKey(key: string): string {\n return key.split('_').map((part, i) => (i === 0 ? part : part[0]!.toUpperCase() + part.slice(1))).join('');\n}\n","/**\n * Filter builder (ARCHITECTURE section 7, G1 api-behavior section 4).\n *\n * 13 leaf operators + `and`/`or` grouping — there is NO `not` grouping\n * operator (negation is `noteq` / `notExist` / `notIn`; G1 pinned).\n * `buildFilter` wraps the caller's conditions; multiple top-level conditions\n * are `and`-wrapped (the node's behaviour). `validateFilter` enforces the\n * vendor caps: <=500 OR-conditions (sum of items across all `or` groups at any\n * depth), <=1 UDF condition per query (`udf: true`), field names <=128 chars,\n * serialised filter <=8000 chars.\n */\nimport { AutotaskConfigError } from './errors.js';\nimport { isRecord } from './utils/index.js';\nimport type { Filter, FilterCondition, FilterOperator, QueryParams } from './types/common.js';\n\n/** The 15 operators (13 leaf + 2 grouping). */\nexport const FILTER_OPERATORS: readonly FilterOperator[] = [\n 'eq', 'noteq', 'gt', 'gte', 'lt', 'lte',\n 'beginsWith', 'endsWith', 'contains',\n 'exist', 'notExist', 'in', 'notIn',\n 'and', 'or',\n];\n\n/** Grouping operators. */\nexport const GROUPING_OPERATORS: readonly FilterOperator[] = ['and', 'or'];\n\n/** Max OR-conditions per query (sum of items across all `or` groups). */\nexport const MAX_OR_CONDITIONS = 500;\n/** Max UDF filter items per query (`udf: true`). */\nexport const MAX_UDF_PER_QUERY = 1;\n/** Max serialised filter length in chars. */\nexport const MAX_QUERY_LENGTH = 8000;\n/** Max GET query URL length in chars (API-side cap; the default POST path is unaffected). */\nexport const MAX_GET_LENGTH = 2048;\n/** Max filter field name length in chars. */\nexport const MAX_FIELD_LENGTH = 128;\n\n/** Type guard for the operator set (exact casing — `EQ` is not an operator). */\nexport function isFilterOperator(op: unknown): op is FilterOperator {\n return typeof op === 'string' && (FILTER_OPERATORS as readonly string[]).includes(op);\n}\n\n/** Validate one condition structurally (operator known, field present, group has items, in/notIn array). */\nfunction validateCondition(cond: FilterCondition, path: string): void {\n if (!isRecord(cond)) {\n throw new AutotaskConfigError(`Filter condition at ${path} must be an object`);\n }\n const op = cond.op;\n if (!isFilterOperator(op)) {\n throw new AutotaskConfigError(\n `Unknown filter operator \"${String(op)}\" at ${path}; expected one of: ${FILTER_OPERATORS.join(', ')}`,\n );\n }\n if (op === 'and' || op === 'or') {\n if (!Array.isArray(cond.items) || cond.items.length === 0) {\n throw new AutotaskConfigError(`Grouping operator \"${op}\" requires a non-empty \"items\" array at ${path}`);\n }\n cond.items.forEach((item, i) => validateCondition(item, `${path}.items[${i}]`));\n return;\n }\n // Leaf operator.\n if (typeof cond.field !== 'string' || cond.field.trim().length === 0) {\n throw new AutotaskConfigError(`Filter condition at ${path} requires a non-empty \"field\"`);\n }\n if (cond.field.length > MAX_FIELD_LENGTH) {\n throw new AutotaskConfigError(\n `Filter field name at ${path} is ${cond.field.length} chars; the cap is ${MAX_FIELD_LENGTH}`,\n );\n }\n if (op === 'in' || op === 'notIn') {\n if (!Array.isArray(cond.value)) {\n throw new AutotaskConfigError(`Operator \"${op}\" requires an array \"value\" at ${path}`);\n }\n }\n if (cond.value !== undefined) {\n const values = Array.isArray(cond.value) ? cond.value : [cond.value];\n for (const value of values) {\n if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') {\n throw new AutotaskConfigError(`Filter value at ${path} must be a string, number or boolean`);\n }\n }\n }\n}\n\n/** Sum of items across all `or` groups, at any nesting depth. */\nfunction countOrConditions(conditions: FilterCondition[]): number {\n let n = 0;\n for (const cond of conditions) {\n if (!isRecord(cond)) continue;\n if (cond.op === 'or' && Array.isArray(cond.items)) n += cond.items.length;\n if (Array.isArray(cond.items)) n += countOrConditions(cond.items);\n }\n return n;\n}\n\n/** Count of conditions carrying `udf: true`, at any nesting depth. */\nfunction countUdfConditions(conditions: FilterCondition[]): number {\n let n = 0;\n for (const cond of conditions) {\n if (!isRecord(cond)) continue;\n if (cond.udf === true) n += 1;\n if (Array.isArray(cond.items)) n += countUdfConditions(cond.items);\n }\n return n;\n}\n\n/** `JSON.stringify(filter)` — the wire shape for the GET `search` param root. */\nexport function serializeFilter(filter: Filter): string {\n return JSON.stringify(filter);\n}\n\n/**\n * Enforce the vendor caps on a built filter. Throws `AutotaskConfigError` for\n * a malformed shape, an unknown operator, a structural violation, or a cap\n * (OR-conditions, UDF conditions, field length, serialised length).\n */\nexport function validateFilter(filter: Filter): void {\n if (!isRecord(filter) || !Array.isArray(filter.filter)) {\n throw new AutotaskConfigError('Filter must be the shape { filter: FilterCondition[] }');\n }\n filter.filter.forEach((condition, i) => validateCondition(condition, `filter[${i}]`));\n\n const orCount = countOrConditions(filter.filter);\n if (orCount > MAX_OR_CONDITIONS) {\n throw new AutotaskConfigError(\n `Query has ${orCount} OR-conditions; the vendor cap is ${MAX_OR_CONDITIONS} — split the query`,\n );\n }\n const udfCount = countUdfConditions(filter.filter);\n if (udfCount > MAX_UDF_PER_QUERY) {\n throw new AutotaskConfigError(\n `Query has ${udfCount} UDF conditions (udf: true); the vendor allows at most ${MAX_UDF_PER_QUERY} per query`,\n );\n }\n const length = serializeFilter(filter).length;\n if (length > MAX_QUERY_LENGTH) {\n throw new AutotaskConfigError(\n `Serialised filter is ${length} chars; the vendor cap is ${MAX_QUERY_LENGTH} — narrow the query`,\n );\n }\n}\n\n/**\n * Wrap the caller's conditions into a `Filter`. A single condition (including\n * a single group) is passed through; multiple top-level conditions are\n * `and`-wrapped. Throws `AutotaskConfigError` for any structural or cap\n * violation (same validation as `validateFilter`).\n */\nexport function buildFilter(conditions: FilterCondition | FilterCondition[]): Filter {\n const list = Array.isArray(conditions) ? conditions : [conditions];\n if (list.length === 0) {\n throw new AutotaskConfigError('buildFilter requires at least one condition');\n }\n const root: FilterCondition = list.length === 1 ? list[0]! : { op: 'and', items: list };\n const filter: Filter = { filter: [root] };\n validateFilter(filter);\n return filter;\n}\n/**\n * The shared query-family filter-shape gate (the ONE normalizer for a user\n * `filter` param): returns the bare conditions array, or `undefined` for\n * the unfiltered carriers — `undefined` AND `null` (the aggregate's own\n * `null` handling is matched for cross-surface consistency).\n *\n * Accepted shapes: a conditions array (`FilterCondition[]`, incl. `[]` —\n * the vendor-accepted no-filter shape) and the `{ filter: [...] }` object\n * shape. Every other defined value is REFUSED pre-request with a typed\n * `AutotaskConfigError` (zero wire) — never silently dropped into an\n * unfiltered query. The message names the accepted shapes, carries one\n * example line, and reports the shape got (type class only — the value is\n * NEVER named; the redaction discipline).\n */\nexport function normalizedConditions(filter: QueryParams['filter'] | null): FilterCondition[] | undefined {\n if (filter === undefined || filter === null) return undefined;\n if (Array.isArray(filter)) return filter;\n if (isRecord(filter) && Array.isArray(filter.filter)) return filter.filter;\n throw new AutotaskConfigError(\n `filter must be a conditions array or { filter: [...] } (e.g. { filter: [{ field: 'status', op: 'eq', value: 'Open' }] }) — got ${refusedFilterShape(filter)}`,\n );\n}\n\n/** The type class of a refused filter value (the shape, never the value). */\nfunction refusedFilterShape(filter: unknown): string {\n if (isRecord(filter) && !('filter' in filter)) return 'an object missing the filter field';\n if (isRecord(filter)) return 'an object whose filter is not a conditions array';\n const t = typeof filter;\n if (t === 'object' || t === 'function') return 'an object';\n return t === 'string' ? 'a string' : `a ${t}`;\n}\n\n","/**\n * HttpClient — fetch transport (ARCHITECTURE section 8).\n *\n * Native global `fetch`, zero runtime dependencies. One transport primitive\n * (`request`) + the pinned envelope unwrap helpers + the query transport\n * (POST-always default; GET opt-in with the 2048-char measurement that THROWS\n * `QueryTooLongError` — the SDK never silently degrades a caller-requested\n * GET).\n *\n * Behaviour: auth headers are the only headers the transport adds\n * automatically (the SDK owns the four auth names); `application/json`\n * whenever a body is set; a whole-call `AbortSignal.timeout` budget bounds\n * the ENTIRE request (connection, all retries, backoff); only idempotent\n * methods (GET/PUT/DELETE) retry on 429/5xx with exponential backoff + jitter\n * (base 200 ms, cap 30 s, honouring `Retry-After`); a FIFO semaphore bounds\n * in-flight requests to `maxConcurrent`. `request` returns the RAW parsed\n * body — envelope unwrapping is an explicit per-call decision (the helpers).\n * Logging is method + path only: never query values, never header values.\n */\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { ReadCache } from './cache.js';\nimport type { FieldCache } from './fieldCache.js';\nimport type { ResourceNameCache } from './resourceNameCache.js';\nimport type { AutotaskClient } from './client.js';\nimport { buildAuthHeaders, withAuthHeaders, type ResolvedAuth } from './auth.js';\nimport {\n buildBreakerKey,\n defaultCircuitBreakerStore,\n isBreakerFailure,\n type CircuitBreakerState,\n type CircuitBreakerStore,\n} from './circuit-breaker.js';\nimport {\n buildTenantKey,\n cooldownDurationMs,\n defaultCooldownStore,\n type CooldownStore,\n} from './cooldown.js';\nimport type { ResolvedAutotaskConfig, ZoneName } from './config.js';\nimport { decideHostPolicy } from './host-policy.js';\nimport {\n AutotaskAbortError,\n AutotaskError,\n AutotaskNetworkError,\n CircuitBreakerError,\n ResponseRejectedError,\n AutotaskTimeoutError,\n QueryTooLongError,\n NotFoundError,\n RateLimitError,\n errorFromStatus,\n EmptyResponseError,\n isDeterministicVendor500,\n parseVendorErrors,\n UnexpectedContentTypeError,\n type CredentialShapeExpectation,\n AutotaskConfigError,\n} from './errors.js';\nimport { CREDENTIAL_ENV_LOAD_ACTION, credentialShapeProblem } from './credential-shape.js';\nimport type { Logger } from './logger.js';\nimport { MAX_GET_LENGTH, buildFilter, normalizedConditions } from './query.js';\nimport { BLIND_SURFACE_STAMPS, EMPTY_REASON_STAMPS, POINTER_NOTES } from './relationships.js';\nimport { redactResponseBody } from './redact.js';\nimport type { AuditEvent, Identifier, OperationResult, PagingModel, QueryParams, ResolutionCaps } from './types/common.js';\nimport { isRecord, newCorrelationId, redactAuditBody } from './utils/index.js';\n\nexport interface RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Path after the base URL, already interpolated, e.g. '/V1.0/Companies/42'. */\n path: string;\n /** URLSearchParams-style params; null/undefined/'' values are omitted. */\n query?: Record<string, unknown>;\n /** JSON-encoded (application/json) when present. */\n body?: unknown;\n /** Extra headers (cannot override the SDK-owned auth names). */\n headers?: Record<string, string>;\n /** Registry operation name for error context. */\n operation?: string;\n /** Per-request timeout override (default: config.timeoutMs). */\n timeoutMs?: number;\n /**\n * INTERNAL (SDK-only, never a caller surface): per-request retry-budget\n * override (default: config.maxRetries). Used by the doctor preflight\n * (src/doctor.ts) to report failures fast — retries off, shortened\n * timeout. Does not change the transport chain order.\n */\n maxRetries?: number;\n /**\n * Issue #25: does this call expect a non-empty 2xx body? Default:\n * `method !== 'DELETE'` (computed in `request`) — a blank 2xx on a\n * non-DELETE throws the typed `EMPTY_RESPONSE` (a blank 200 from a proxy\n * or maintenance edge is a transport fault, not \"no data\"); DELETE (and\n * any explicit `expectBody: false`) keeps returning `undefined` (the\n * vendor answers 204 / an empty body on deletes; the delete callers\n * synthesize the result from the path id).\n */\n expectBody?: boolean;\n /** Caller abort signal, combined with the deadline; aborting throws `AutotaskAbortError` (never retried). */\n signal?: AbortSignal;\n /** Safe to retry on 429/5xx even though it is not GET/PUT/DELETE (e.g. the `/query` POST reads). Default: by method. */\n idempotent?: boolean;\n /**\n * INTERNAL (SDK-only, never a caller surface): skip the INV-A1 response\n * redaction for this one response. Used by the V2 partial-update merge\n * read: the record's own current values round-trip back to the SAME\n * vendor endpoint (the PUT response is `{ id }` — the caller never sees\n * them, and the G10b request-body audit keeps request logging redacted).\n * Redacting this read would put literal '[REDACTED]' markers into the\n * merged PUT body (data corruption on live records).\n */\n skipResponseRedaction?: boolean;\n /**\n * INTERNAL (SDK-only, never a caller surface): bypass the tenant 429\n * cooldown gate for this one call. Used by `thresholdInformation.get()`\n * so a throttled tenant can still read its own headroom (a 2xx from the\n * call clears the gate; a 429 re-arms it).\n */\n bypassCooldown?: boolean;\n /**\n * INTERNAL (SDK-only, never a caller surface): bypass the host circuit\n * breaker's REFUSAL for this one call (issue #26 — the #6\n * ThresholdInformation bypass applies). Used by\n * `thresholdInformation.get()` so a downed host can still be probed for\n * headroom. The call's outcome is still RECORDED against the circuit\n * (a 2xx counts toward closing; a counted failure re-arms the open\n * period).\n */\n bypassCircuitBreaker?: boolean;\n}\n\n/** Idempotent methods the transport may retry (POST/PATCH are never retried). */\nexport const IDEMPOTENT_METHODS: readonly string[] = ['GET', 'PUT', 'DELETE'];\n\nconst BACKOFF_BASE_MS = 200;\nconst BACKOFF_CAP_MS = 30_000;\n/** Longest single retry wait; a larger `Retry-After` surfaces the error instead of sleeping. */\nconst MAX_RETRY_DELAY_MS = 60_000;\nconst HOUR_MS = 3_600_000;\n\n/**\n * Issue #54: the request-path guard. Refuses (typed CONFIG_ERROR, zero wire)\n * a path that does not start with `/`, or whose path part (before `?`)\n * carries `#`, `\\`, a control character, or a `.`/`..` segment (also\n * percent-encoded, e.g. `%2e%2e`) — the shapes that move a request off the\n * intended endpoint.\n */\nfunction assertSafePath(path: string): void {\n const pathPart = path.split('?', 1)[0]!;\n // eslint-disable-next-line no-control-regex\n const bad = !path.startsWith('/') || /[#\\\\\\u0000-\\u001f\\u007f]/.test(pathPart) || pathPart.split('/').some((segment) => {\n let decoded: string;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n return true; // malformed percent-encoding\n }\n return decoded === '.' || decoded === '..' || /[/\\\\]/.test(decoded);\n });\n if (bad) {\n throw new AutotaskConfigError(`Refused request path ${JSON.stringify(path.slice(0, 200))}: not a plain absolute API path (dot segment, '#', '\\\\', control character or missing leading '/')`);\n }\n}\n\n/**\n * Build the absolute request URL (base + path + query). Issue #54: the path\n * is guarded ({@link assertSafePath}) and the built URL must stay on the\n * base's origin — the credential headers never leave the configured host.\n */\nexport function buildUrl(baseUrl: string, path: string, query?: Record<string, unknown>): string {\n assertSafePath(path);\n let url = baseUrl + path;\n if (new URL(url).origin !== new URL(baseUrl).origin) {\n throw new AutotaskConfigError(`Refused request path ${JSON.stringify(path.slice(0, 200))}: it leaves the configured origin`);\n }\n if (query !== undefined) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined || value === '') continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n if (qs.length > 0) url += `?${qs}`;\n }\n return url;\n}\n\n/**\n * Map the vendor's `nextPageUrl` cursor to a request path for `baseUrl`.\n * Issue #54: the cursor is server-supplied, so it is resolved against the\n * base and REFUSED (ResponseRejectedError, zero wire) when its origin\n * differs — page 2 never goes to another host with the credentials. The\n * base pathname (e.g. `/atservicesrest`) is stripped so `buildUrl` does not\n * double it.\n */\nexport function cursorToPath(baseUrl: string, cursor: string): string {\n const base = new URL(baseUrl);\n let url: URL;\n try {\n url = new URL(cursor, base);\n } catch {\n throw new ResponseRejectedError('Refused the pagination cursor: not a parseable URL');\n }\n if (url.origin !== base.origin) {\n throw new ResponseRejectedError(`Refused the pagination cursor: it points off the configured origin (${url.origin})`);\n }\n const basePath = base.pathname.replace(/\\/+$/, '');\n const path = basePath !== '' && url.pathname.startsWith(`${basePath}/`) ? url.pathname.slice(basePath.length) : url.pathname;\n return path + url.search;\n}\n\n/**\n * Issue #43: the vendor's UNAUTHENTICATED zone-discovery endpoint (the\n * leftover #37 prior art — WYRE-AI/autotask-mcp). The tenant's actual zone\n * is published here without credentials, which is what makes it usable as\n * a recovery signal from inside the client. The response's `url` is the\n * ONLY accepted re-point target (a 401 body-injected URL must never\n * receive the credentials).\n */\nconst ZONE_DISCOVERY_URL = 'https://webservices.autotask.net/atservicesrest/v1.0/zoneInformation';\n\n/**\n * Issue #43: validate + normalize a discovery-provided zone base URL\n * (http/https only, trailing slashes stripped — the same contract as the\n * configured baseUrl). undefined when the value is not an http(s) base: a\n * discovery fault, never a re-point target (the credentials never travel to\n * a non-http(s) host).\n */\nfunction normalizeZoneBase(raw: string): string | undefined {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n return undefined;\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return undefined;\n return `${url.origin}${url.pathname.replace(/\\/+$/, '')}`;\n}\n\n/**\n * Build the RequestOptions for a `/query` call (ARCHITECTURE section 8.2).\n * POST-always by default — body `{ MaxRecords?, IncludeFields?, filter }` (the `filter` field is ALWAYS sent — an empty array when absent — node parity; some zone versions 500 on its absence)\n * (the node's production wire shape; `filter` is the conditions array).\n * `via: 'get'` — GET `?search=<json>` with the FULL measured URL checked\n * against the 2048-char cap; above it the call THROWS `QueryTooLongError`\n * (never a silent switch to POST). When `includeFields` is set the SDK\n * always appends `id` (issue #59: the vendor omits `id` from a row unless\n * it is named, and every caller needs the id to act on the row).\n */\nexport function buildQueryRequest(baseUrl: string, resourcePath: string, params: QueryParams): RequestOptions {\n const queryPath = `${resourcePath}/query`;\n const conditions = normalizedConditions(params.filter);\n const filter = conditions === undefined ? undefined : buildFilter(conditions);\n // Issue #59: append `id` to a caller-set includeFields when not already\n // named (no-op when the caller named it, in any position) — both the GET\n // search JSON and the POST body carry the same effective list.\n const includeFields =\n params.includeFields === undefined\n ? undefined\n : params.includeFields.includes('id')\n ? params.includeFields\n : [...params.includeFields, 'id'];\n\n if (params.via === 'get') {\n const search: Record<string, unknown> = {};\n if (filter !== undefined) search.filter = filter.filter;\n if (params.maxRecords !== undefined) search.maxRecords = params.maxRecords;\n if (includeFields !== undefined) search.includeFields = includeFields;\n const req: RequestOptions = {\n method: 'GET',\n path: queryPath,\n query: { search: JSON.stringify(search) },\n };\n const url = buildUrl(baseUrl, queryPath, req.query);\n if (url.length > MAX_GET_LENGTH) {\n throw new QueryTooLongError(\n `GET query URL is ${url.length} chars; the vendor GET cap is ${MAX_GET_LENGTH}`,\n );\n }\n return req;\n }\n\n const body: Record<string, unknown> = {};\n if (params.maxRecords !== undefined) body.MaxRecords = params.maxRecords;\n if (includeFields !== undefined) body.IncludeFields = includeFields;\n // ALWAYS send a `filter` field — node parity: the node initializes\n // `filters.filter = []` before every query POST (get-many.ts\n // \"Ensure filters.filter is initialized\"). Some zone API versions NRE\n // on a missing filter field (live-verified 2026-10-01 against the\n // AU03/ww29 tenant: 500 `{\"errors\":[\"Value cannot be null. Parameter\n // name: filters\"]}`); an empty array is the vendor-accepted no-filter\n // shape (the swagger marks it optional, the live zone does not).\n body.filter = filter === undefined ? [] : filter.filter;\n return { method: 'POST', path: queryPath, body, idempotent: true };\n}\n\n/**\n * Ambient caller signal (`AsyncLocalStorage`): every request issued inside\n * {@link runWithSignal} is cancelled by it, so a host (an MCP request handler)\n * can abort an in-flight SDK call without every method growing a signal\n * parameter. An explicit `RequestOptions.signal` wins over the ambient one.\n */\nconst ambientSignal = new AsyncLocalStorage<AbortSignal>();\n\n/** Run `fn` with `signal` cancelling every SDK request it starts (and their retry waits). */\nexport function runWithSignal<T>(signal: AbortSignal, fn: () => T): T {\n return ambientSignal.run(signal, fn);\n}\n\n/** Sleep that rejects as soon as `signal` aborts (the timer is always cleared). */\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) return reject(signal.reason);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(signal.reason);\n };\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Read the body as text, refusing (Content-Length pre-check, then a streaming count) above `max` bytes. */\nasync function readBodyText(\n res: Response,\n max: number,\n what: string,\n ctx: { operation?: string; url: string; correlationId: string; httpStatus: number },\n): Promise<string> {\n const tooLarge = (): ResponseRejectedError =>\n new ResponseRejectedError(`Response for ${what} exceeds maxResponseBytes (${max})`, {\n ...ctx,\n code: 'RESPONSE_TOO_LARGE',\n suggestedAction: 'Narrow the query (filter/includeFields) or raise maxResponseBytes.',\n });\n const declared = Number(res.headers.get('Content-Length'));\n if (Number.isFinite(declared) && declared > max) {\n await res.body?.cancel().catch(() => undefined);\n throw tooLarge();\n }\n if (res.body === null) return '';\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > max) {\n await reader.cancel().catch(() => undefined);\n throw tooLarge();\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n}\n\n/** Exponential backoff with equal jitter: base 200 ms, doubled per attempt, capped at 30 s. */\nfunction backoffDelay(attempt: number): number {\n const exp = Math.min(BACKOFF_CAP_MS, BACKOFF_BASE_MS * 2 ** attempt);\n return Math.floor(exp / 2 + Math.random() * (exp / 2));\n}\n\n/** Parse `Retry-After` (integer seconds or an HTTP date) into seconds. */\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) return Number.parseInt(trimmed, 10);\n // A signed number is neither an integer-second count nor an HTTP date.\n // (Date.parse is lenient: it happily parses '-5' as a year, which would\n // surface as a 0-second cooldown for a hostile header.)\n if (/^[+-]?\\d+$/.test(trimmed)) return undefined;\n const asDate = Date.parse(trimmed);\n if (Number.isFinite(asDate)) {\n const secs = Math.ceil((asDate - Date.now()) / 1000);\n return Math.max(secs, 0);\n }\n return undefined;\n}\n\nfunction isAbortLike(err: unknown): boolean {\n return typeof err === 'object' && err !== null && 'name' in err && (err as { name?: unknown }).name === 'AbortError';\n}\n\n/**\n * #24: a JSON-ish media type (parameters stripped, case-insensitive):\n * `application/json*` or any plus-json-suffixed type. `text/*` — including\n * `text/json` — is NOT json-ish: a wrong CONTENT TYPE on a non-JSON 2xx is\n * the maintenance-page signal (UNEXPECTED_CONTENT_TYPE); only the JSON-ish\n * and the header-LESS cases keep the status-quo INVALID_RESPONSE.\n */\nfunction isJsonMediaType(header: string): boolean {\n const mediaType = header.split(';')[0]?.trim().toLowerCase() ?? '';\n return mediaType.startsWith('application/json') || mediaType.endsWith('+json');\n}\n\n/**\n * #24: the first 256 BYTES of the raw body (UTF-8 — a codepoint cut in the\n * middle is completed by Node's decoder as U+FFFD: the cut never throws and\n * never emits an invalid sequence), then the response-redaction transform.\n * The transform is name-based and a documented no-op on free text (a raw\n * string carries no key names to match) — the honest semantics are\n * truncation-only.\n */\nfunction bodySnippet(text: string, redactPersonalData: boolean): string {\n const bytes = Buffer.from(text, 'utf8').subarray(0, 256).toString('utf8');\n return redactResponseBody(bytes, { redactPersonalData }) as string;\n}\n\n/** The transport. */\n/** The header names the SDK owns as credentials (the auth header builder's output). */\nconst CREDENTIAL_HEADER_NAMES: ReadonlySet<string> = new Set<string>([\n 'ApiIntegrationCode',\n 'UserName',\n 'Secret',\n 'ImpersonationResourceId',\n]);\n\n/**\n * C1 credential shape gate at the wire boundary: every OWNED credential header is checked BEFORE\n * the request is built. A value from a quote-preserving env load is printable ASCII, so it passes\n * the transport's non-printable guard and would reach the vendor verbatim; refusing it here yields\n * a typed, value-free `INVALID_CREDENTIAL_SHAPE` error and NO request. Value-free: the message\n * names the header and the env-load pitfall, never the value.\n */\nfunction assertCredentialShape(\n headers: Record<string, string>,\n auth: ResolvedAuth,\n): void {\n const owned = new Set<string>(CREDENTIAL_HEADER_NAMES);\n for (const name of Object.keys(buildAuthHeaders(auth))) owned.add(name);\n for (const name of Object.keys(headers)) {\n if (!owned.has(name)) continue;\n const value = headers[name] as string;\n const shape = credentialShapeProblem(value.trim(), { skipEdgeWhitespace: true });\n if (shape === undefined) continue;\n throw new AutotaskConfigError(\n `${name} ${CREDENTIAL_ENV_LOAD_ACTION} (${shape})`,\n {\n code: 'INVALID_CREDENTIAL_SHAPE',\n suggestedAction:\n 'Load the credential with the shell (`set -a; . ./.env; set +a`) or with ' +\n 'loadAutotaskCredentialsFromEnv() from node-autotask; single-quoted values must be ' +\n 'shell-sourced, not parsed by a quote-preserving loader. No request was sent.',\n },\n );\n }\n}\n\n/**\n * The credential shape of the values that were actually SENT for this attempt. Only the header\n * NAMES (plus a boolean) cross this boundary — a value never leaves the transport. Returns\n * `undefined` when no owned credential header is present, so there is nothing to annotate.\n */\nfunction credentialShapeExpectation(\n headers: Record<string, string>,\n auth: ResolvedAuth,\n): CredentialShapeExpectation | undefined {\n const owned = new Set<string>(CREDENTIAL_HEADER_NAMES);\n for (const name of Object.keys(buildAuthHeaders(auth))) owned.add(name);\n const names = Object.keys(headers).filter((name) => owned.has(name));\n if (names.length === 0) return undefined;\n let problem: string | undefined;\n for (const name of names) {\n const value = headers[name] as string;\n problem = credentialShapeProblem(value.trim(), { skipEdgeWhitespace: true });\n if (problem !== undefined) break;\n }\n return {\n headerNames: names,\n allValuesClean: problem === undefined,\n ...(problem !== undefined ? { problem } : {}),\n };\n}\n\nexport class HttpClient {\n /**\n * The LIVE base URL (issue #43): the construction-time value until a zone\n * re-point happens, then the tenant's newly resolved zone base. Reads are\n * source-compatible with the pre-#43 readonly field; the ONLY write site\n * is the 401 recovery's `repointZoneBase` (process-lifetime, never\n * persisted — like a cache). The configured base (`config.baseUrl`)\n * stays the construction-time value; `baseUrl` is where the client\n * TALKS.\n */\n get baseUrl(): string {\n return this.liveBaseUrl;\n }\n /** The owning client (assigned by the AutotaskClient constructor right\n * after construction). The transport is shared by every resource; the\n * cross-resource composite name resolution (issue #77) reaches the sibling\n * resource holders and the client config through this back-reference.\n * Undefined only for a standalone transport, which never runs a composite. */\n client: AutotaskClient | undefined;\n readonly maxConcurrent: number;\n readonly timeoutMs: number;\n /** Bounded client-scan caps for resolution (section 19.2; per-client). */\n readonly resolution: ResolutionCaps;\n /** Single-record read cache (issue #80: the default instance when `cache` is absent; undefined only when the user set `false` explicitly). */\n readonly readCache: ReadCache | undefined;\n /** Field-metadata cache for the entityInformation trio (issue #80: the default instance when `fieldCache` is absent; undefined only when the user set `false` explicitly). */\n readonly fieldCache: FieldCache | undefined;\n /** Resource-name cache for `operations.expandResourceNames` (issue #80: the default instance when `resourceNameCache` is absent; undefined only when the user set `false` explicitly, issue #65). */\n readonly resourceNameCache: ResourceNameCache | undefined;\n /** Resolved update fallback gate (issue #34; OFF by default). */\n readonly update: { putFallback: boolean };\n private readonly auth: ResolvedAuth;\n private readonly maxRetries: number;\n private readonly maxResponseBytes: number;\n private readonly perHour: number | undefined;\n /** The resolved profile (issue #4) — the agent profile changes the\n * exhaustion `suggestedAction` (stop/narrow, never \"raise the limit\"). */\n private readonly profile: 'library' | 'agent';\n /** Request timestamps inside the trailing hour (only used when `rateLimit.perHour` is set). */\n private readonly hourStamps: number[] = [];\n /** Tenant 429 cooldown gate store (undefined when the gate is disabled). */\n private readonly cooldownStore: CooldownStore | undefined;\n private readonly cooldownMaxMs: number;\n private readonly cooldownDefaultMs: number;\n /** The live base URL (issue #43 — the `baseUrl` getter's backing field;\n * re-pointed by the 401 recovery's `repointZoneBase`). */\n private liveBaseUrl: string;\n /** The resolved named zone (issue #43): the CATALOG-base marker for the\n * re-point gate — `undefined` for a bare explicit baseUrl, `'other'` for\n * an explicit baseUrl named \"other\"; neither class is re-pointable.\n * (The construction-time value — a re-point changes the live base, not\n * the configured zone.) */\n readonly zone: ZoneName | undefined;\n /** The resolved zone re-resolution gate (issue #43; OFF by default). */\n readonly reResolveZoneOn401: boolean;\n /** The resolved opt-in host bounds (skill 3.5.0 / L2, finding A1; absent\n * when the caller supplied no `hostPolicy` — the byte-identical default).\n * Gates the issue-#43 re-point target: a refused host is a discovery\n * fault (the original 401 propagates byte-identically, zero wire). */\n private readonly hostPolicy: { blockPrivate: boolean; allowedOrigins: readonly string[] } | undefined;\n /** The gate key for this client's tenant (lowercased userName + host).\n * Re-derived on a zone re-point (issue #43 — the re-pointed host starts\n * with fresh per-host state). */\n private tenantKey: string;\n /** The host circuit breaker settings (issue #26; undefined when the\n * breaker is off — the default, in which case the gate/recording sites\n * are skipped and no store entry is ever written). */\n private readonly breaker: {\n failureWindowMs: number;\n failureThreshold: number;\n openTimeoutMs: number;\n successesToClose: number;\n halfOpenProbes: number;\n store: CircuitBreakerStore;\n isFailure: (err: AutotaskError) => boolean;\n } | undefined;\n /** The breaker key for this client's host (lowercased host of the base\n * URL — host-only: vendor health is host-scoped, issue #26). Re-derived\n * on a zone re-point (issue #43). */\n private breakerKey: string;\n private readonly logger: Logger;\n /** Response redaction policy (the INV-A1 hotfix; PII/CONFIDENTIAL default on, SECRET always).\n * Public read so the single dry-run envelope builder (base.ts `buildDryRunResult`)\n * threads the SAME resolved policy (INV-E M3 — the in-process input echo). */\n readonly redactPersonalData: boolean;\n /** The configured UserName (the authenticated user). Public read so the\n * ZoneInformation resource can send the swagger-required `user` query\n * param (the same public-read precedent as redactPersonalData — the value\n * already travels in every auth header; nothing new crosses the boundary). */\n readonly userName: string;\n private readonly onAudit: ((event: AuditEvent) => void) | undefined;\n private inFlight = 0;\n private readonly waitQueue: Array<() => void> = [];\n\n constructor(config: ResolvedAutotaskConfig) {\n this.liveBaseUrl = config.baseUrl;\n this.resolution = config.resolution;\n this.readCache = config.readCache;\n this.fieldCache = config.fieldCache;\n this.resourceNameCache = config.resourceNameCache;\n this.update = config.update;\n this.zone = config.zone;\n this.reResolveZoneOn401 = config.reResolveZoneOn401;\n this.hostPolicy = config.hostPolicy;\n this.onAudit = config.onAudit;\n this.auth = {\n apiIntegrationCode: config.apiIntegrationCode,\n userName: config.userName,\n secret: config.secret,\n impersonationResourceId: config.impersonationResourceId,\n };\n this.maxRetries = config.maxRetries;\n this.maxResponseBytes = config.maxResponseBytes;\n this.perHour = config.rateLimit?.perHour;\n this.tenantKey = buildTenantKey(config.userName, config.baseUrl);\n this.cooldownStore = config.cooldown.enabled ? (config.cooldown.store ?? defaultCooldownStore()) : undefined;\n this.cooldownMaxMs = config.cooldown.maxMs;\n this.cooldownDefaultMs = config.cooldown.defaultMs;\n this.breakerKey = buildBreakerKey(config.baseUrl);\n this.breaker = config.circuitBreaker.enabled\n ? {\n failureWindowMs: config.circuitBreaker.failureWindowMs,\n failureThreshold: config.circuitBreaker.failureThreshold,\n openTimeoutMs: config.circuitBreaker.openTimeoutMs,\n successesToClose: config.circuitBreaker.successesToClose,\n halfOpenProbes: config.circuitBreaker.halfOpenProbes,\n store: config.circuitBreaker.store ?? defaultCircuitBreakerStore(),\n isFailure: config.circuitBreaker.isFailure ?? isBreakerFailure,\n }\n : undefined;\n this.profile = config.profile;\n this.maxConcurrent = config.maxConcurrent;\n this.timeoutMs = config.timeoutMs;\n this.logger = config.logger;\n this.redactPersonalData = config.redactPersonalData;\n this.userName = config.userName;\n }\n\n /**\n * The LOCAL hourly-budget state (the sliding window this client counts):\n * `{ perHour, used, remaining }` — `undefined` when `rateLimit.perHour`\n * is off. The limiter is PER PROCESS (issue #4): it cannot see other\n * instances or integrations on the tenant — the tenant-wide count is\n * `thresholdInformation.get()`.\n */\n hourlyBudget(): { perHour: number; used: number; remaining: number } | undefined {\n if (this.perHour === undefined) return undefined;\n const now = Date.now();\n while (this.hourStamps.length > 0 && (this.hourStamps[0] as number) <= now - HOUR_MS) this.hourStamps.shift();\n return { perHour: this.perHour, used: this.hourStamps.length, remaining: Math.max(0, this.perHour - this.hourStamps.length) };\n }\n\n /**\n * Breaker success recording (issue #26): a 2xx that got through counts\n * toward `successesToClose` whenever the host has an armed state (open or\n * half-open — a half-open probe, or a threshold-bypass probe of a downed\n * host; decision Q10). A probe completion decrements the admitted-probe\n * budget. On reaching `successesToClose` the circuit CLOSES: counters\n * reset and the entry is DELETED (a healthy host leaves no trace — the\n * #6 delete-on-2xx precedent). A success while closed (or with no entry)\n * is a no-op: the closed failure window is a rate window that prunes\n * itself lazily, not a gate a success clears early.\n */\n private recordBreakerSuccess(probe: boolean, probeKey?: string): void {\n const breaker = this.breaker;\n if (breaker === undefined) return;\n // A probe admitted on one host must never record onto another: if the\n // call re-pointed (issue #43) the outcome was measured on a different\n // host — void the probe (the admitted budget on the original host\n // dangles for the rest of the open period; bounded, conservative,\n // nothing crosses hosts).\n if (probe && (probeKey === undefined || probeKey !== this.breakerKey)) return;\n const key = probe && probeKey !== undefined ? probeKey : this.breakerKey;\n const st = breaker.store.get(key);\n if (st === undefined || st.openedAt === null) return;\n const next: CircuitBreakerState = {\n failures: st.failures,\n openedAt: st.openedAt,\n successes: st.successes + 1,\n probes: probe ? Math.max(0, st.probes - 1) : st.probes,\n };\n if (next.successes >= breaker.successesToClose) {\n breaker.store.delete(key);\n this.logger.warn?.(\n `[autotask] circuit breaker CLOSED for ${key} (${next.successes} probe successes)`,\n undefined,\n );\n return;\n }\n breaker.store.set(key, next);\n }\n\n /**\n * Breaker failure recording (issue #26): called from the outer catch (the\n * single choke point every surfaced failure passes through) for errors\n * the failure predicate counts. While closed, a counted failure appends\n * to the window-pruned `failures` (keeping only timestamps strictly inside\n * `failureWindowMs`) and OPENS the circuit at `failureThreshold`. While\n * open / half-open (a probe failure, a racy late probe failure, or a\n * threshold-bypass failure) it RE-ARMS the open period from now and\n * resets the success count (the #6 \"a 429 re-arms\" precedent — a bypass\n * failure never fails silently).\n */\n private recordBreakerFailure(probe: boolean, probeKey?: string, correlationId?: string): void {\n const breaker = this.breaker;\n if (breaker === undefined) return;\n // Issue #43: same host-pinning as the success recorder — a probe\n // admitted on one host never records onto another after a re-point.\n if (probe && (probeKey === undefined || probeKey !== this.breakerKey)) return;\n const key = probe && probeKey !== undefined ? probeKey : this.breakerKey;\n const now = Date.now();\n const st = breaker.store.get(key) ?? { failures: [], openedAt: null, successes: 0, probes: 0 };\n if (st.openedAt === null) {\n // closed: keep only the failures strictly inside the window, then append.\n const failures = [...st.failures.filter((t) => t > now - breaker.failureWindowMs), now];\n if (failures.length >= breaker.failureThreshold) {\n breaker.store.set(key, { failures, openedAt: now, successes: 0, probes: 0 });\n this.logger.warn?.(\n `[autotask] circuit breaker OPEN for ${key} (${failures.length} counted failures in ${Math.round(breaker.failureWindowMs / 1000)}s) — refusing locally for ${Math.round(breaker.openTimeoutMs / 1000)}s`,\n correlationId,\n );\n return;\n }\n breaker.store.set(key, { ...st, failures });\n return;\n }\n // open / half-open: re-arm the open period from now.\n breaker.store.set(key, {\n failures: st.failures,\n openedAt: now,\n successes: 0,\n probes: probe ? Math.max(0, st.probes - 1) : st.probes,\n });\n }\n\n private acquire(): Promise<void> {\n if (this.inFlight < this.maxConcurrent) {\n this.inFlight += 1;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n this.waitQueue.push(() => {\n this.inFlight += 1;\n resolve();\n });\n });\n }\n\n private release(): void {\n this.inFlight -= 1;\n const next = this.waitQueue.shift();\n if (next !== undefined) next();\n }\n\n /**\n * One request: build URL/headers, apply the whole-call deadline, retry\n * idempotent methods on 429/5xx, map failures to the typed errors.\n * Returns the RAW parsed body (2xx); `undefined` for an empty 2xx body.\n */\n /**\n * One audit event per settled request (section 19.3): the correlation id,\n * the redacted request body, the outcome. An audit hook that throws never\n * breaks the request.\n */\n private emitAudit(event: AuditEvent): void {\n if (this.onAudit === undefined) return;\n try {\n this.onAudit(event);\n } catch {\n // an audit sink is best-effort; a faulty hook must not break requests\n }\n }\n\n /** Sliding-window `rateLimit.perHour` limiter: waits for a slot within the call budget, else throws. */\n private async takeHourlySlot(\n deadlineAt: number,\n signal: AbortSignal,\n ctx: { operation?: string; url: string; correlationId: string },\n ): Promise<void> {\n if (this.perHour === undefined) return;\n for (;;) {\n const now = Date.now();\n while (this.hourStamps.length > 0 && (this.hourStamps[0] as number) <= now - HOUR_MS) this.hourStamps.shift();\n if (this.hourStamps.length < this.perHour) {\n this.hourStamps.push(now);\n return;\n }\n const waitMs = (this.hourStamps[0] as number) + HOUR_MS - now;\n if (waitMs >= deadlineAt - now) {\n // Fail fast (issue #4): the LOCAL budget is exhausted. The agent\n // profile's suggestedAction tells the LLM to stop or narrow the\n // query — never to raise the limit (raising it just burns more of\n // the tenant's shared vendor budget).\n const err = new RateLimitError(`Client-side rateLimit.perHour (${this.perHour}) exhausted; next slot in ${Math.ceil(waitMs / 1000)}s`, {\n ...ctx,\n suggestedAction:\n this.profile === 'agent'\n ? 'Stop or narrow the query — the LOCAL hourly budget is exhausted (per-process: it cannot see other instances or integrations on the tenant). Do NOT raise rateLimit.perHour; the window frees in about an hour.'\n : 'Back off until the hourly window frees a slot, or raise rateLimit.perHour.',\n });\n err.retryAfter = Math.ceil(waitMs / 1000);\n throw err;\n }\n await sleep(waitMs, signal);\n }\n }\n\n /**\n * Issue #43: the re-point gate — the zone re-resolution is available for\n * this request. ALL gates must hold (the WYRE prior art, adopted\n * verbatim): the flag is ON (strict `true`, off by default), the live\n * base is CATALOG-derived (an explicit baseUrl — a bare one, or\n * `zone: 'other'` + baseUrl — is NEVER re-pointed: the operator said\n * where to go), and the path is RELATIVE (an absolute path, e.g. a\n * cursor `nextPageUrl`, is already baked to a host we do not own and\n * cannot be rewritten). The fourth gate — \"this is not already the\n * recovery retry\" (exactly ONE retry, never a loop) — is enforced at the\n * call site by the request-local `zoneRetry` flag.\n */\n private canReResolveZone(opts: RequestOptions): boolean {\n if (!this.reResolveZoneOn401) return false;\n if (this.zone === undefined || this.zone === 'other') return false;\n if (!opts.path.startsWith('/') || /^https?:\\/\\//i.test(opts.path)) return false;\n return true;\n }\n\n /**\n * Issue #43: one UNAUTHENTICATED vendor zone-discovery call\n * (`GET https://webservices.autotask.net/atservicesrest/v1.0/zoneInformation?user=<userName>`\n * — NO auth headers: the recovery signal must not leak credentials to a\n * host that is not the configured API base). Returns the tenant's\n * resolved zone base URL, or undefined on ANY fault (network, non-2xx,\n * redirect, malformed body, missing/invalid `url`) — the caller then\n * propagates the original 401 untouched (zero retry). Bounded by the\n * SAME whole-call deadline as the request it recovers.\n */\n private async discoverZoneBase(\n signal: AbortSignal,\n ctx: { operation?: string; url: string; correlationId: string },\n ): Promise<string | undefined> {\n const discoveryUrl = `${ZONE_DISCOVERY_URL}?user=${encodeURIComponent(this.userName)}`;\n let res: Response;\n try {\n res = await fetch(discoveryUrl, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n redirect: 'manual', // a redirect off the discovery host is a fault, not a target\n signal,\n });\n } catch {\n return undefined; // a network fault — the 401 propagates, zero retry\n }\n if (res.status < 200 || res.status >= 300) {\n await res.body?.cancel().catch(() => undefined);\n return undefined;\n }\n let text: string;\n try {\n text = await readBodyText(res, this.maxResponseBytes, 'zone discovery', { ...ctx, httpStatus: res.status });\n } catch {\n return undefined;\n }\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n return undefined; // malformed — a discovery fault, not a re-point\n }\n if (!isRecord(body) || typeof body.url !== 'string' || body.url.trim().length === 0) {\n return undefined; // missing/empty `url` — a discovery fault\n }\n return normalizeZoneBase(body.url);\n }\n\n /**\n * Issue #43: re-point the client to the tenant's newly resolved zone\n * base. The transport's PER-HOST state is RE-DERIVED, so the re-pointed\n * host starts FRESH: no cooldown/breaker/tenant-rate inheritance from\n * the stale host (conservative — the stale host's armed entries stay in\n * the shared stores for the other clients that still talk to it; nothing\n * is copied across). The configured base (config.baseUrl) is untouched;\n * the LIVE base is `baseUrl` (the getter over liveBaseUrl), and the\n * re-point is logged (a transport fact — the success path is unchanged,\n * no envelope change).\n */\n private repointZoneBase(to: string): void {\n const from = this.liveBaseUrl;\n this.liveBaseUrl = to;\n this.tenantKey = buildTenantKey(this.auth.userName, to);\n this.breakerKey = buildBreakerKey(to);\n this.logger.warn?.(\n `[autotask] zone re-point ${from} -> ${to} (a 401 on the stale zone base; the vendor's unauthenticated zone discovery named the tenant's current zone) — retrying the request once against the new base`,\n undefined,\n );\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const method = opts.method;\n // `let`: the issue-#43 zone recovery re-points the live base mid-call\n // and rebuilds the URL against it before the ONE retry.\n let url = buildUrl(this.baseUrl, opts.path, opts.query);\n // Issue #43: the zone-recovery state for THIS call (the no-loop flag —\n // set once the recovery fires; a second 401 then surfaces with the\n // `zoneRecovery` detail and no third attempt).\n let zoneRetry: { from: string; to: string } | undefined;\n const headers = withAuthHeaders(opts.headers, this.auth);\n // C1 credential shape gate at the wire boundary (2026-10-07 incident class): the resolved auth\n // headers are the LAST point before the wire, so a value that survived a quote-preserving load\n // is refused here instead of being sent and answered with an opaque vendor 401. The gate is\n // cheap and zero-wire; the standard non-printable guard in `withAuthHeaders` is untouched.\n assertCredentialShape(headers, this.auth);\n if (opts.body !== undefined) headers['Content-Type'] = 'application/json';\n const bodyText = opts.body !== undefined ? JSON.stringify(opts.body) : undefined;\n const correlationId = newCorrelationId();\n const timeoutMs = opts.timeoutMs ?? this.timeoutMs;\n const maxRetries = opts.maxRetries ?? this.maxRetries;\n const started = Date.now();\n const deadlineAt = started + timeoutMs;\n const callerSignal = opts.signal ?? ambientSignal.getStore();\n const signal = AbortSignal.any(\n callerSignal === undefined ? [AbortSignal.timeout(timeoutMs)] : [AbortSignal.timeout(timeoutMs), callerSignal],\n );\n const auditBody = opts.body !== undefined ? redactAuditBody(opts.body) : undefined;\n const retriable = opts.idempotent ?? IDEMPOTENT_METHODS.includes(method);\n // Issue #25: method-based default — every non-DELETE call expects a body\n // (a blank 2xx throws EMPTY_RESPONSE); DELETE keeps the status-quo\n // undefined (the vendor's 204 / empty delete answer; the delete callers\n // synthesize the result from the path id).\n const expectBody = opts.expectBody ?? (method !== 'DELETE');\n const ctx = { operation: opts.operation, url, correlationId };\n let lastStatus: number | undefined;\n\n // The caller's signal wins over the deadline when both fired.\n const interrupted = (): AutotaskError =>\n callerSignal?.aborted\n ? new AutotaskAbortError(`Request aborted: ${method} ${opts.path}`, { ...ctx, suggestedAction: 'The caller aborted; re-issue the call if still needed.' })\n : new AutotaskTimeoutError(`Request timed out after ${timeoutMs}ms: ${method} ${opts.path}`, ctx);\n // A retry only runs when its wait fits inside what is left of the call budget.\n const canWait = (delay: number): boolean => delay <= MAX_RETRY_DELAY_MS && delay < deadlineAt - Date.now();\n const pause = async (delay: number): Promise<void> => {\n try {\n await sleep(delay, signal);\n } catch {\n throw interrupted();\n }\n };\n\n // Tenant 429 cooldown gate (issue #6): a 429 armed the gate for this\n // tenant — fail LOCALLY (before the semaphore, the hourly limiter and\n // fetch: zero upstream calls) until the deadline passes.\n if (this.cooldownStore !== undefined && !opts.bypassCooldown) {\n const deadline = this.cooldownStore.get(this.tenantKey);\n if (deadline !== undefined) {\n const remainingMs = deadline - Date.now();\n if (remainingMs > 0) {\n // An already-aborted caller signal still produces the abort error.\n if (callerSignal?.aborted) throw interrupted();\n const seconds = Math.ceil(remainingMs / 1000);\n const err = new RateLimitError(\n `Tenant is in a rate-limit cooldown; the call was NOT sent. ${seconds}s remain — do not retry before then, and narrow the query (filter/includeFields) before retrying.`,\n {\n ...ctx,\n code: 'RATE_LIMITED_COOLDOWN',\n retryable: false,\n suggestedAction: `Wait ${seconds}s (per-tenant 429 cooldown) and retry with a narrower query; the call was not sent and consumed no vendor budget.`,\n },\n );\n err.retryAfter = seconds;\n err.notSent = true;\n this.emitAudit({\n correlationId,\n operation: opts.operation,\n method,\n path: opts.path,\n durationMs: Date.now() - started,\n body: auditBody,\n notSent: true,\n errorCode: 'RATE_LIMITED_COOLDOWN',\n });\n throw err;\n }\n // Lazy expiry: the first call after the deadline deletes the entry and proceeds.\n this.cooldownStore.delete(this.tenantKey);\n }\n }\n\n // Host circuit breaker gate (issue #26): the SAME pre-send slot as the\n // #6 cooldown gate (cooldown first — existing code, minimal diff):\n // OUTSIDE the retry loop, before the hourly limiter, the semaphore and\n // fetch — a refusal makes zero fetches, consumes no hourly stamp and no\n // concurrency slot. Timer-free: the state is derived from Date.now()\n // (closed = no armed state; open = until openedAt + openTimeoutMs;\n // half-open = the lazy transition after). `thresholdInformation.get()`\n // bypasses the REFUSAL (`bypassCircuitBreaker`) but its outcome is still\n // recorded.\n let breakerProbe = false;\n // Issue #43: the host key the probe was ADMISSIONED against. The\n // recorders pin to it: a zone re-point mid-call re-derives\n // `this.breakerKey` to the NEW host, so recording a stale-host probe\n // against the live key would decrement the new host's probe budget\n // (or close its circuit early) — bookkeeping from one host must not\n // leak onto another (the #43 hygiene rule).\n let breakerProbeKey: string | undefined;\n if (this.breaker !== undefined && !opts.bypassCircuitBreaker) {\n // An already-aborted caller signal still produces the abort error.\n if (callerSignal?.aborted) throw interrupted();\n const now = Date.now();\n const st = this.breaker.store.get(this.breakerKey);\n if (st !== undefined && st.openedAt !== null) {\n const openUntil = st.openedAt + this.breaker.openTimeoutMs;\n if (now < openUntil) {\n // OPEN — refuse locally (zero upstream calls). `retryable: true`\n // is the deliberate divergence from #6's cooldown refusal (the\n // open period is bounded and advertised via retryAfter — retry the\n // SAME call after the wait; no narrowing needed).\n const remainingMs = openUntil - now;\n const seconds = Math.ceil(remainingMs / 1000);\n const err = new CircuitBreakerError(\n `The circuit breaker for ${this.breakerKey} is open; the call was NOT sent. ${seconds}s remain — retry the same call after the wait (a host-scoped vendor fault, not the request).`,\n {\n ...ctx,\n details: { state: 'open', retryAfterMs: remainingMs, failureCount: st.failures.length },\n suggestedAction: `Wait ${seconds}s (the circuit is open for ${this.breakerKey}) and retry the SAME call; the call was not sent and consumed no vendor budget.`,\n },\n );\n err.retryAfter = seconds;\n err.notSent = true;\n this.emitAudit({\n correlationId,\n operation: opts.operation,\n method,\n path: opts.path,\n durationMs: Date.now() - started,\n body: auditBody,\n notSent: true,\n errorCode: 'CIRCUIT_BREAKER_OPEN',\n });\n throw err;\n }\n // HALF-OPEN (the lazy transition — no timers): admit up to\n // halfOpenProbes probes; a verdict-pending budget is a refusal too\n // (the bounded-probes contract — the circuit may not let unbounded\n // calls through while probing).\n if (st.probes >= this.breaker.halfOpenProbes) {\n const err = new CircuitBreakerError(\n `The circuit breaker for ${this.breakerKey} is half-open and its probes are in flight; the call was NOT sent — retry once a probe settles.`,\n {\n ...ctx,\n details: { state: 'half-open', retryAfterMs: 0, failureCount: st.failures.length },\n suggestedAction: 'A half-open probe is settling; retry shortly — the call was not sent and consumed no vendor budget.',\n },\n );\n err.notSent = true;\n this.emitAudit({\n correlationId,\n operation: opts.operation,\n method,\n path: opts.path,\n durationMs: Date.now() - started,\n body: auditBody,\n notSent: true,\n errorCode: 'CIRCUIT_BREAKER_OPEN',\n });\n throw err;\n }\n const admitted: CircuitBreakerState = { ...st, probes: st.probes + 1 };\n this.breaker.store.set(this.breakerKey, admitted);\n breakerProbe = true;\n breakerProbeKey = this.breakerKey;\n }\n // closed (or nothing recorded for the host): admit — a healthy host\n // leaves no store entry.\n }\n\n this.logger.debug?.(`[autotask] ${method} ${opts.path}`, correlationId);\n\n try {\n let attempt = 0;\n let outcome: { value: T; status: number } | null = null;\n for (;;) {\n try {\n await this.takeHourlySlot(deadlineAt, signal, ctx);\n } catch (err) {\n if (signal.aborted) throw interrupted();\n throw err;\n }\n await this.acquire();\n let res: Response;\n try {\n res = await fetch(url, { method, headers, body: bodyText, signal, redirect: 'manual' });\n } catch (err) {\n this.release();\n if (signal.aborted || isAbortLike(err)) throw interrupted();\n const delay = backoffDelay(attempt);\n if (attempt < maxRetries && retriable && canWait(delay)) {\n this.logger.warn?.(\n `[autotask] network error on ${method} ${opts.path}; retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`,\n correlationId,\n );\n attempt += 1;\n await pause(delay);\n continue;\n }\n throw new AutotaskNetworkError(\n `Network error during ${method} ${opts.path}: ${err instanceof Error ? err.message : String(err)}`,\n ctx,\n );\n }\n\n let status: number;\n let text: string;\n try {\n status = res.status;\n if (status >= 300 && status < 400) {\n // Never follow: auth headers must not travel to another origin.\n await res.body?.cancel().catch(() => undefined);\n throw new ResponseRejectedError(\n `Refused to follow a ${status} redirect for ${method} ${opts.path}`,\n { ...ctx, code: 'REDIRECT_BLOCKED', httpStatus: status, suggestedAction: 'Check the configured zone/baseUrl; the API does not redirect.' },\n );\n }\n text = await readBodyText(res, this.maxResponseBytes, `${method} ${opts.path}`, { ...ctx, httpStatus: status });\n } catch (err) {\n this.release();\n if (err instanceof AutotaskError) throw err;\n if (signal.aborted || isAbortLike(err)) throw interrupted();\n throw new AutotaskNetworkError(\n `Network error reading the response of ${method} ${opts.path}: ${err instanceof Error ? err.message : String(err)}`,\n ctx,\n );\n }\n this.release();\n lastStatus = status;\n\n if (status >= 200 && status < 300) {\n // A 2xx proves the tenant has headroom: clear the cooldown gate early\n // (a no-op when nothing is armed).\n if (this.cooldownStore !== undefined) this.cooldownStore.delete(this.tenantKey);\n if (text.length === 0) {\n if (expectBody) {\n // Issue #25: a blank 2xx on a call that expects a result is a\n // transport fault (proxy / maintenance edge), not \"no data\" —\n // throw the typed EMPTY_RESPONSE BEFORE any unwrap helper runs.\n // `retryable` is advisory (the loop never retries 2xx): true for\n // non-DELETE reads. The typed empty-reason stamp (issue #14) is\n // attached here, mirroring the errorFromStatus site, so a pinned\n // blind surface (e.g. companies.query) keeps it.\n const err = new EmptyResponseError(`Empty ${status} response for ${method} ${opts.path}`, {\n ...ctx,\n httpStatus: status,\n retryable: method !== 'DELETE',\n details: { httpStatus: status, method },\n });\n attachEmptyReasonDetails(err);\n throw err;\n }\n outcome = { value: undefined as T, status };\n break;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n // #24: the decode attempt above is UNCONDITIONAL (JSON under an odd\n // Content-Type still decodes and never lands here). Classify the\n // non-JSON 2xx by the response Content-Type — the FIRST time the\n // transport reads it:\n // - JSON-ish media type (application/json*, */*+json) → the status-\n // quo INVALID_RESPONSE (the W-A7 / #13 marker-recovery key — a\n // wrong-shape 2xx is a shape-level failure, not a transport one);\n // - NO header → INVALID_RESPONSE too (conservative — the maintenance\n // page premise carries a header; a header-less wire fact would\n // flip this row);\n // - anything else (text/* and friends) → the typed, retryable\n // UNEXPECTED_CONTENT_TYPE (an edge/maintenance page — the vendor\n // never processed the request).\n const contentType = res.headers.get('Content-Type');\n const err =\n contentType !== null && contentType !== '' && !isJsonMediaType(contentType)\n ? new UnexpectedContentTypeError(\n `Non-JSON response body for ${method} ${opts.path} (HTTP ${status})`,\n {\n ...ctx,\n httpStatus: status,\n details: {\n httpStatus: status,\n contentType,\n bodySnippet: bodySnippet(text, this.redactPersonalData),\n },\n // The content-type is host-sourced (a host-supplied\n // baseUrl can serve arbitrary HTML) — capped, never prose;\n // the raw snippet rides details only.\n suggestedAction: retriable\n ? `The zone answered with a non-JSON body (content-type: ${contentType.slice(0, 100)}); the zone is likely in a maintenance window — retry after the window, or verify baseUrl points at the REST API.`\n : `The zone answered a write with a non-JSON body (content-type: ${contentType.slice(0, 100)}); the request may have taken effect — verify the record before re-issuing (writes are never auto-retried).`,\n },\n )\n : new AutotaskError(`Invalid JSON response body for ${method} ${opts.path}`, {\n ...ctx,\n code: 'INVALID_RESPONSE',\n category: 'server',\n httpStatus: status,\n suggestedAction: 'The zone returned a non-JSON 2xx body; verify baseUrl points at the REST API.',\n });\n // #24 retry leg: the maintenance page is served by the EDGE (the\n // vendor never processed the request), so retrying an IDEMPOTENT\n // method is safe — per the loop's existing condition (GET/PUT/\n // DELETE + idempotent-flagged POST) with the same Retry-After /\n // backoff / wait-budget rules as the 5xx leg. A non-idempotent call\n // makes ONE request and throws at once (the residue concern, #13\n // precedent). An INVALID_RESPONSE 2xx (JSON-ish or header-less) is\n // NEVER retried — a real contract break is not transient.\n if (err.code === 'UNEXPECTED_CONTENT_TYPE' && retriable && attempt < maxRetries) {\n const retryAfter = parseRetryAfter(res.headers.get('Retry-After'));\n const delay = retryAfter !== undefined ? retryAfter * 1000 : backoffDelay(attempt);\n if (canWait(delay)) {\n this.logger.warn?.(\n `[autotask] non-JSON 2xx on ${method} ${opts.path}; retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`,\n correlationId,\n );\n attempt += 1;\n await pause(delay);\n continue;\n }\n }\n attachEmptyReasonDetails(err); // issue #14 channel: uniform across transport-thrown errors\n throw err;\n }\n // The INV-A1 hotfix: one deep transform of the parsed body — every\n // JSON response surface (dedicated tools, invoke, compositions)\n // crosses the SDK boundary already redacted (SECRET always;\n // PII/CONFIDENTIAL per the resolved policy; request bodies are\n // never touched — see src/redact.ts). The single internal bypass is\n // the V2 merge round-trip read (skipResponseRedaction — see\n // RequestOptions; the values go back to the same vendor endpoint,\n // never to a caller).\n outcome = {\n value: opts.skipResponseRedaction\n ? (parsed as T)\n : (redactResponseBody(parsed, { redactPersonalData: this.redactPersonalData }) as T),\n status,\n };\n break;\n }\n\n let body: unknown;\n if (text.length > 0) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n // #23: a deterministic vendor field-validation 500 (a known phrase over\n // the parsed errors[] — the body is already parsed at the retry site)\n // can never succeed on retry: break out BEFORE the retry decision\n // (exactly one upstream call). The mapping below keeps the ServerError\n // class + status 500 and marks it non-retryable.\n const deterministic500 = status >= 500 && isDeterministicVendor500(parseVendorErrors(body));\n const retryableStatus = status === 429 || status >= 500;\n if (retryableStatus && !deterministic500 && attempt < maxRetries && retriable) {\n const retryAfter = parseRetryAfter(res.headers.get('Retry-After'));\n const delay = retryAfter !== undefined ? retryAfter * 1000 : backoffDelay(attempt);\n if (canWait(delay)) {\n this.logger.warn?.(\n `[autotask] ${status} on ${method} ${opts.path}; retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`,\n correlationId,\n );\n attempt += 1;\n await pause(delay);\n continue;\n }\n }\n\n // Issue #43: the zone re-resolution (gates in canReResolveZone — the\n // request-local `zoneRetry` flag is the fourth, no-loop gate): one\n // UNAUTHENTICATED vendor zone-discovery call, and if the tenant's\n // resolved zone base DIFFERS from the live base, re-point the client\n // and retry the SAME request ONCE against it. The re-point target\n // comes ONLY from the discovery response (the 401 body is never\n // consulted for a URL). A discovery fault, or a resolved base\n // IDENTICAL to the live one, falls through to today's typed 401\n // byte-identically (zero retry — the recovery must never turn a\n // credential fault into a discovery fault).\n if (status === 401 && zoneRetry === undefined && this.canReResolveZone(opts)) {\n const target = await this.discoverZoneBase(signal, ctx);\n // Skill 3.5.0 / L2 (finding A1): when hostPolicy is active the\n // discovery-provided re-point target must pass the SAME bounds\n // (private first, then the allow-list). A refused host is a\n // DISCOVERY FAULT — the re-point never happens and the original\n // 401 propagates byte-identically (zero wire to the refused host,\n // credentials never sent there).\n const targetViolation =\n target === undefined || this.hostPolicy === undefined\n ? null\n : decideHostPolicy(target, this.hostPolicy);\n if (targetViolation !== null) {\n this.logger.warn?.(\n `[autotask] zone re-point refused by hostPolicy (${targetViolation.bound}): ${targetViolation.origin} — the original 401 propagates, zero wire to the refused host`,\n undefined,\n );\n }\n if (target !== undefined && targetViolation === null && target !== this.baseUrl) {\n zoneRetry = { from: this.baseUrl, to: target };\n this.repointZoneBase(target);\n // The retry is the SAME request (method/path/query/body/\n // operation) against the new base — rebuild the URL against the\n // re-pointed live base and re-enter the loop. The `zoneRetry`\n // flag now holds the no-loop gate for the retry itself.\n url = buildUrl(this.baseUrl, opts.path, opts.query);\n continue;\n }\n // target === undefined (a discovery fault) or target === this.baseUrl\n // (the zone did not move — genuinely bad credentials): today's typed\n // 401 propagates byte-identically — zero retry.\n }\n\n const retryAfterSecs = parseRetryAfter(res.headers.get('Retry-After'));\n const err = errorFromStatus(\n status,\n body,\n url,\n opts.operation,\n this.redactPersonalData,\n credentialShapeExpectation(headers, this.auth),\n );\n err.correlationId = correlationId;\n // Issue #43: the recovery fired and the retried request 401'd again —\n // the typed 401 keeps its identity and gains the self-explaining\n // detail (the zone moved and the retry was attempted; the credentials\n // still fail — this is not a discovery fault). Additive only: the\n // status / code / message / retryability never change.\n if (status === 401 && zoneRetry !== undefined) {\n err.details = {\n ...(err.details ?? {}),\n zoneRecovery: { from: zoneRetry.from, to: zoneRetry.to, retried: true },\n };\n }\n attachEmptyReasonDetails(err); // issue #14: the typed reason/pointer rides the details\n if (err instanceof RateLimitError && retryAfterSecs !== undefined) err.retryAfter = retryAfterSecs;\n // Arm the tenant cooldown when the 429 is about to surface (retries\n // spent, Retry-After beyond the wait budget, or a non-retriable\n // method) — never while the same call is still retrying.\n if (status === 429 && this.cooldownStore !== undefined) {\n const threadThreshold = err.code.toLowerCase() === 'itgenatr005';\n const durationMs = cooldownDurationMs(retryAfterSecs, {\n maxMs: this.cooldownMaxMs,\n defaultMs: this.cooldownDefaultMs,\n threadThreshold,\n });\n this.cooldownStore.set(this.tenantKey, Date.now() + durationMs);\n this.logger.warn?.(\n `[autotask] 429 on ${method} ${opts.path} surfaces after ${attempt + 1} attempt(s); tenant cooldown armed for ${Math.round(durationMs / 1000)}s`,\n correlationId,\n );\n }\n throw err;\n }\n if (outcome !== null) {\n this.emitAudit({\n correlationId,\n operation: opts.operation,\n method,\n path: opts.path,\n status: outcome.status,\n durationMs: Date.now() - started,\n body: auditBody,\n });\n // Breaker success recording (issue #26): a 2xx that got through\n // counts toward closing the host circuit (a half-open probe, or a\n // threshold-bypass probe of a downed host — decision Q10; a no-op\n // while closed and when nothing is recorded for the host).\n if (this.breaker !== undefined) {\n try {\n this.recordBreakerSuccess(breakerProbe, breakerProbeKey);\n } catch {\n // breaker bookkeeping is best-effort; a faulty store must never\n // break a successful request\n }\n }\n return outcome.value;\n }\n } catch (err) {\n // Breaker failure recording (issue #26): the outer catch is the\n // single choke point every surfaced failure passes through. The\n // notSent guard keeps a LOCAL refusal (the cooldown's, or the\n // breaker's own — both are thrown pre-loop and never reach here;\n // the guard is defense in depth) out of the counted failures, and\n // the predicate decides the rest (never ABORTED, a 4xx, the\n // deterministic validation 500, or a policy refusal).\n if (this.breaker !== undefined && err instanceof AutotaskError && (err as { notSent?: boolean }).notSent !== true) {\n try {\n if (this.breaker.isFailure(err)) this.recordBreakerFailure(breakerProbe, breakerProbeKey, correlationId);\n } catch {\n // breaker bookkeeping is best-effort; a faulty store must never\n // break the error path\n }\n }\n this.emitAudit({\n correlationId,\n operation: opts.operation,\n method,\n path: opts.path,\n status: lastStatus,\n durationMs: Date.now() - started,\n body: auditBody,\n errorCode: err instanceof AutotaskError ? err.code : 'NETWORK_ERROR',\n });\n // Issue #31: a drift signal invalidates the ONE entity the call named\n // (the entity's field-cache entries, if any — the next metadata read\n // refetches): a deterministic vendor field-validation 500 (the vendor\n // just said a field belief is wrong), or an INVALID_RESPONSE on the\n // metadata trio (the catalog shape moved). An ordinary record write\n // says nothing about the field catalog and never invalidates; the TTL\n // is the other expiry path. Attribution: the operation's resource\n // prefix (`tickets.create` -> `tickets`); an unattributable call\n // leaves the TTL to do its job.\n if (this.fieldCache !== undefined && err instanceof AutotaskError) {\n const op = typeof opts.operation === 'string' ? opts.operation : undefined;\n const verb = op !== undefined ? op.slice(op.lastIndexOf('.') + 1) : '';\n const drift =\n (err.details?.deterministic === true) ||\n (err.code === 'INVALID_RESPONSE' && META_TRIO_VERBS.has(verb));\n if (drift && op !== undefined) {\n const dot = op.indexOf('.');\n if (dot > 0) this.fieldCache.invalidate(op.slice(0, dot));\n }\n }\n throw err;\n } finally {\n // A real write (even a failed one — it may have partly applied) voids cached reads.\n if (!(method === 'GET' || opts.idempotent === true)) {\n this.readCache?.clear();\n // Issue #65: a real write to the `resources` resource (a rename through\n // this client) ALSO voids the name cache — SCOPED invalidation:\n // a write to any other resource says nothing about resource names (the\n // fieldCache \"an ordinary record write never invalidates\" rule, scoped\n // variant), so only the resources-table writes clear the channel.\n // Attribution: the operation's resource prefix (`resources.update` ->\n // `resources`), the same extraction as the fieldCache drift site above.\n const nameOp = typeof opts.operation === 'string' ? opts.operation : undefined;\n const nameDot = nameOp !== undefined ? nameOp.indexOf('.') : -1;\n if (\n this.resourceNameCache !== undefined &&\n nameOp !== undefined &&\n nameDot > 0 &&\n nameOp.slice(0, nameDot) === 'resources'\n ) {\n this.resourceNameCache.clear();\n }\n }\n }\n // The loop only exits via an outcome (returned above) or a throw — the\n // tail is unreachable, but the type needs a terminus.\n throw new AutotaskError('unreachable: the request loop ended without an outcome');\n }\n}\n\nconst INVALID_SHAPE_ACTION = 'Report the unexpected response shape; verify baseUrl points at the REST API.';\n\n/** Issue #31: the metadata trio verbs whose INVALID_RESPONSE is a field-catalog\n * drift signal (the shape moved) — a record read's INVALID_RESPONSE is not. */\nconst META_TRIO_VERBS: ReadonlySet<string> = new Set(['getEntityInfo', 'getFieldInfo', 'getUdfInfo']);\n\n/** query: expects `{ items: T[], pageDetails: PagingModel }`; validates both present (no re-wrap). */\n/**\n * Issue #14: attach the typed empty-reason / pointer-note details to a\n * typed error (ADDITIVE — the error code / status / message /\n * retryability are never mutated). The surface key is the error's\n * `operation` (the caller passes it on every request/unwrap):\n * - a pinned `EMPTY_REASON_STAMPS` row → `details.emptyReason` (the pinned\n * info: kind + note + authority + remedy);\n * - a pinned `POINTER_NOTES` row → `details.pointerNote` (the pointer\n * sentence — the op is a known wall; the status/code are untouched);\n * - the generic `.get` miss (item === null, no pin) → a synthesized\n * `not-found` reason.\n * Non-pinned surfaces stay unattached (no speculation).\n */\nfunction attachEmptyReasonDetails(err: AutotaskError): void {\n if (err.operation === undefined) return;\n const dot = err.operation.indexOf('.');\n if (dot <= 0) return;\n const resource = err.operation.slice(0, dot);\n const op = err.operation.slice(dot + 1);\n const surface = err.operation;\n const stamp = EMPTY_REASON_STAMPS[resource]?.[op];\n const pointer = POINTER_NOTES[surface];\n const isGetMiss = err instanceof NotFoundError && op === 'get';\n if (stamp === undefined && pointer === undefined && !isGetMiss) return;\n err.details = { ...(err.details ?? {}) };\n if (stamp !== undefined) {\n err.details.emptyReason = stamp;\n } else if (isGetMiss) {\n // Blind-aware (post-verification F3): on a plan-pinned blind surface a\n // `.get` miss proves nothing about existence — the record may exist and\n // be invisible to this API user, so \"no record exists\" is a claim the\n // surface cannot support; the pin's note is the honest reason (the\n // shape mirrors base.ts blindEmptyReason byte-for-byte — base.ts imports\n // this module, so the shape is inlined here instead of imported).\n const blindOps = BLIND_SURFACE_STAMPS[resource];\n const blind =\n blindOps !== undefined ? Object.values(blindOps).find((v) => v !== undefined) : undefined;\n err.details.emptyReason =\n blind !== undefined\n ? {\n surface,\n kind: 'blind-surface',\n note: blind.note,\n authority: blind.authority,\n remedy: 'the note is the remedy — the authority op answers for a record',\n }\n : {\n surface,\n kind: 'not-found',\n note: `no ${resource} record exists at this id (a miss is the data, not an error condition)`,\n authority: `${resource}.query`,\n remedy: `query the ${resource} collection (a bounded queryBounded walk) or verify the id from the authority surface — do not retry the same get`,\n };\n }\n if (pointer !== undefined) err.details.pointerNote = pointer;\n}\n\nexport function unwrapItems<T>(body: unknown, operation?: string): { items: T[]; pageDetails: PagingModel } {\n if (!isRecord(body) || !Array.isArray(body.items) || !isRecord(body.pageDetails)) {\n const err = new AutotaskError('Expected the query envelope { items, pageDetails }; got a different shape', {\n code: 'INVALID_RESPONSE',\n category: 'server',\n operation,\n suggestedAction: INVALID_SHAPE_ACTION,\n });\n attachEmptyReasonDetails(err); // issue #14: the pinned shape-drift note (if any) rides the details\n throw err;\n }\n return { items: body.items as T[], pageDetails: body.pageDetails as unknown as PagingModel };\n}\n\n/**\n * get: expects `{ item: T }`. `item === null` THROWS `NotFoundError` (the\n * vendor not-found signal — HTTP may be 200) with `httpStatus: 200` and\n * `resourceIds: [id]` when `id` is given.\n */\nexport function unwrapItem<T>(body: unknown, id?: Identifier, operation?: string): T {\n if (!isRecord(body) || !('item' in body)) {\n throw new AutotaskError('Expected the item envelope { item }; got a different shape', {\n code: 'INVALID_RESPONSE',\n category: 'server',\n operation,\n suggestedAction: INVALID_SHAPE_ACTION,\n });\n }\n const item = body.item;\n if (item === null) {\n const err = new NotFoundError(\n id !== undefined ? `The record with ID ${id} was not found` : 'The record was not found',\n {\n httpStatus: 200,\n resourceIds: id !== undefined ? [id] : undefined,\n operation,\n suggestedAction: 'Verify the id, or resolve the record by name first.',\n },\n );\n attachEmptyReasonDetails(err); // issue #14: the pinned reason (or the generic not-found) rides the details\n throw err;\n }\n return item as T;\n}\n\n/** count: expects `{ queryCount: number }` (an object, not a bare number) → the plain number. */\nexport function unwrapQueryCount(body: unknown, operation?: string): number {\n if (!isRecord(body) || typeof body.queryCount !== 'number') {\n const err = new AutotaskError('Expected the count envelope { queryCount: number }; got a different shape', {\n code: 'INVALID_RESPONSE',\n category: 'server',\n operation,\n suggestedAction: INVALID_SHAPE_ACTION,\n });\n attachEmptyReasonDetails(err); // issue #14: the pinned reason (if any) rides the details\n throw err;\n }\n return body.queryCount;\n}\n\n/** create/update/delete: expects `{ itemId }` (accepts `{ id }` too) → `{ id }`. */\nexport function unwrapOperation(body: unknown, operation?: string): OperationResult {\n const value = isRecord(body) ? (body.itemId !== undefined ? body.itemId : body.id) : undefined;\n const idValue = toIdentifierId(value);\n if (idValue === undefined) {\n const err = new AutotaskError(\n 'Expected OperationResultModel { itemId } (or { id }); got a different shape',\n { code: 'INVALID_RESPONSE', category: 'server', operation, suggestedAction: INVALID_SHAPE_ACTION },\n );\n attachEmptyReasonDetails(err); // issue #14: the pinned shape-drift note (if any) rides the details\n throw err;\n }\n return { id: idValue };\n}\n\n/** swagger types `itemId` as generic `Object`; accept integers and numeric\n * strings. An all-digit string beyond the safe range keeps its exact digits\n * (the string form is the only lossless carrier for vendor ids above 2^53). */\nfunction toIdentifierId(value: unknown): Identifier | undefined {\n if (typeof value === 'number' && Number.isInteger(value)) return value;\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n const trimmed = value.trim();\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isSafeInteger(parsed) ? parsed : trimmed;\n }\n return undefined;\n}\n\n/** invoice markup/pdf + attachment downloads: raw pass-through (no re-wrap). */\nexport function passthrough<T>(body: unknown): T {\n return body as T;\n}\n","/**\n * Relationship map + blind-surface stamps + the delete-boundary /\n * marker-field channels — GENERATED by\n * scripts/generate-capabilities.mjs (the 5th generated artifact; S12-C, run\n * mcp-fix-20261003; issue #9). Do not hand-edit; re-run the generator. The\n * plan is the single source (scripts/lib/relationships.mjs re-derives this\n * file — the drift guard is scripts/check-capabilities.mjs +\n * test/scripts/relationships-artifact.test.ts).\n *\n * Consumers:\n * - operations.relationshipMap (the autotask_relationship_map tool, S12-B)\n * serves RELATIONSHIP_MAP — zero wire by construction;\n * - src/resources/base.ts attaches BLIND_SURFACE_STAMPS to the 0/empty\n * count/query results of the pinned blind surfaces (the T10 typed\n * sentinel — additive: count/items values are never mutated), stamps the\n * create dry run with DELETE_BOUNDARY_NOTES (issue #9 — report-only) and\n * attaches EMPTY_REASON_STAMPS to 0/empty count/query results + the\n * update dry-run envelope (issue #14 — additive);\n * - src/http.ts attaches EMPTY_REASON_STAMPS / POINTER_NOTES to typed\n * errors (issue #14 — the reason rides on the error details, additive);\n * - operations.recovery reads DELETE_BOUNDARY_NOTES + MARKER_FIELDS\n * (issue #9 — zero wire);\n * - src/resources/base.ts reads RESPONSE_DRIFT_MARKERS on a drifted 2xx\n * create (issue #13 — ONE bounded marker read; absent pin = old behaviour);\n * - operations.blindSurfaces / operations.probeReachability serve\n * BLIND_SURFACE_INVENTORY + REACHABILITY_PROBE_DEFAULTS (issue #11 —\n * the inventory is zero wire; the probe is a bounded read sweep);\n * - operations.createGuidance serves CREATE_GUIDANCE (issue #12 — the\n * 92-entity zone-fact catalog, zero wire);\n * - src/resources/base.ts reads UNTRUSTED_FIELDS_BY_RESOURCE for the\n * queryBounded noteChars free-text cap (issue #61 — response-side only);\n * - docs/API.md §11.7/§11.8/§11.9/§11.10/§11.11/§11.12 render the same facts.\n *\n * planHash: ac8d4bed714eeae53029f1da07c0305ab80916424dab448904f865c715b192c6\n */\n// [GENERATED:RELATIONSHIPS:START]\nimport type { EmptyReasonInfo } from './types/common.js';\n\n/** One pinned blind-surface stamp (the result-time sentinel object). */\nexport interface BlindSurfaceInfo {\n /** The pinned surface, e.g. 'companies.count'. */\n surface: string;\n /** The zone label (the facts are zone-specific — never read across zones). */\n zone: string;\n /** The blind class: unowned-blind | fully-blind | unfiltered-blind. */\n kind: 'unowned-blind' | 'fully-blind' | 'unfiltered-blind';\n /** The authority op that returns the record (the remedy the sentinel serves). */\n authority: string;\n /** The zone fact + remedy, LLM-consumer grade. */\n note: string;\n}\n\n/** One blind-surface inventory row (issue #11 — the served discovery row). */\nexport interface BlindSurfaceRow {\n /** The plan resource key. */\n resource: string;\n /** The affected read ops (the pinned subset of count/query that exist for the resource). */\n ops: Array<'count' | 'query'>;\n /** The blind class (closed set): unowned-blind | fully-blind | unfiltered-blind | unknown (no class assigned — data-full or no count observable). */\n kind: 'unowned-blind' | 'fully-blind' | 'unfiltered-blind' | 'unknown';\n /** The ww29 discovery fact: rows seen for the unfiltered limit-2 read (0 = blind; 1-2 = data-full; null = no count observable). */\n unfilteredRows: number | null;\n /** The authority op that answers for a record (e.g. companies.get); null when the plan has no get row. */\n authority: string | null;\n /** The discovery fact + remedy, LLM-consumer grade. */\n note: string;\n /** The proof level: live-verified | discovery-sweep | spec-derived. */\n proof: 'live-verified' | 'discovery-sweep' | 'spec-derived';\n}\n\n/** The blind-surface inventory (issue #11 — the served 116-surface artifact). */\nexport interface BlindSurfaceInventory {\n zone: string;\n label: string;\n verifiedAt: string | null;\n /** The discovery sweep date (the ww29 run). */\n discoveredAt: string | null;\n surfaces: BlindSurfaceRow[];\n counts: { total: number; dataFull: number; blind: number; pinned: number };\n /** The resources the sweep found data-full (safe for unfiltered reads). */\n dataFull: string[];\n remedies: { generic: string; byResource: Record<string, string> };\n}\n\n/** The probe defaults (issue #11 — served zero-wire; gate re-derives). */\nexport interface ProbeDefaults {\n defaultCap: number;\n hardCap: number;\n limitDefault: number;\n limitMax: number;\n defaultTargets: string[];\n}\n\n/** The create-blocker class (issue #12 — the closed 9-set; the gate re-derives). */\nexport type CreateBlockerKind =\n | 'ok'\n | 'blind-reference'\n | 'blind-parent'\n | 'picklist-unexposed'\n | 'undocumented-ladder'\n | 'resource-role-pair'\n | 'delete-absent'\n | 'non-mutable'\n | 'unknown';\n\n/** The structured blocker on one create-guidance row (issue #12). */\nexport interface CreateGuidanceBlocker {\n kind: CreateBlockerKind;\n /** The wall statement, LLM-consumer grade (the exact vendor text rides in vendorEvidence). */\n message: string;\n /** The blind reference field (blind-reference rows — e.g. projectType). */\n referenceField?: string;\n /** The remedy (what to do about it). */\n remedy: string;\n}\n\n/** One create-guidance row (issue #12 — the served zone-fact row). */\nexport interface CreateGuidanceRow {\n resource: string;\n /** The correct create op key (e.g. tickets.create); null when the plan has no create row. */\n createOp: string | null;\n parentScoped: boolean;\n /** The fields the vendor accepted, in the order the vendor demanded them (live-proven). */\n liveProvenPrefix: string[];\n /** True when the ladder consumed fields but the create still failed (e.g. opportunities — W-A5). */\n unproven: boolean;\n /** The structured blocker (null = none — a clean live-verified create). */\n blocker: CreateGuidanceBlocker | null;\n /** The EXACT vendor message text observed (never paraphrased) + the correlation ids left out. */\n vendorEvidence: string[];\n /** The spec-derived delete boundary (the W-A1 field on the same row). */\n deleteBoundary: { available: boolean; note: string | null };\n zone: string;\n}\n\n/** The zone-fact create-guidance report (issue #12 — the served 92-entity catalog). */\nexport interface CreateGuidanceReport {\n zone: string;\n label: string;\n verifiedAt: string | null;\n rows: CreateGuidanceRow[];\n counts: { total: number; byKind: Record<CreateBlockerKind, number> };\n}\n\n/** A scoped child of one resource (its scoped ops + natural keys). */\nexport interface RelationshipChild {\n resource: string;\n apiEntity: string | null;\n /** The FK field on the child model pointing at the parent. */\n parentField: string | null;\n /** The vendor path segment (e.g. 'Notes' under /V1.0/Tickets/{parentId}/Notes). */\n parentSegment: string | null;\n tier: string | null;\n workflowResource: boolean;\n specialOps: string[];\n searchCovers: string | null;\n /** Which of the scoped verbs exist as registry ops for this child. */\n scopedOps: { create: boolean; query: boolean; update: boolean; delete: boolean };\n}\n\n/** The per-resource relationship entry (the operations.relationshipMap row). */\nexport interface RelationshipResource {\n resource: string;\n apiEntity: string | null;\n kind: string;\n path: string | null;\n parentScoped: boolean;\n tier: string | null;\n workflowResource: boolean;\n group: string | null;\n /** The parent (null for top-level resources). */\n parent: { resource: string; segment: string | null; field: string | null } | null;\n children: RelationshipChild[];\n naturalKeys: { hasSearch: boolean; searchCovers: string | null; findBy: string[] };\n /** The pinned blind surfaces for this resource (null = none pinned). */\n blindSurfaces: { count?: { kind: string; note: string }; query?: { kind: string; note: string } } | null;\n /** The plan-pinned zone facts (null = none pinned for this resource).\n * The createGuidance field (issue #12) is ADDITIVE: the relationship map\n * keeps serving the existing createRequiredSet/quirks shape byte-for-\n * byte; the wider served catalog is operations.createGuidance. */\n zoneFacts: {\n createRequiredSet?: string[];\n quirks?: string[];\n createGuidance?: {\n createOp: string | null;\n parentScoped: boolean;\n liveProvenPrefix: string[];\n unproven: boolean;\n blocker: {\n kind: CreateBlockerKind;\n message: string;\n referenceField?: string;\n remedy: string;\n } | null;\n vendorEvidence: string[];\n deleteBoundary: { available: boolean; note: string | null };\n zone: string;\n };\n } | null;\n /** The spec-derived delete boundary (issue #9; null = the vendor defines a DELETE). */\n deleteBoundary: { note: string; proof: string } | null;\n /** The spec-derived name-like field the recovery marker query filters on (issue #9; null = none). */\n markerField: string | null;\n}\n\n/** The spec-derived delete boundary for one create (issue #9). */\nexport interface DeleteBoundaryInfo {\n /** The resource key. */\n resource: string;\n /** The deterministic boundary note (spec-derived). */\n note: string;\n /** The proof level: 'spec-derived' (issue #9 channel) or 'live-verified' (the S11 13-record set — separate channel). */\n proof: 'spec-derived' | 'live-verified';\n}\n\n/** The zone the live-verified facts describe (never read across zones). */\nexport const RELATIONSHIP_ZONE = {\n \"zone\": \"ww29\",\n \"label\": \"australia-nz\",\n \"verifiedAt\": \"2026-10-03\"\n} as { zone: string; label: string; verifiedAt: string | null };\n\n/** Per-resource relationship map (the 128 plan resources). */\nexport const RELATIONSHIP_MAP: Record<string, RelationshipResource> = {\n \"appointments\": {\n \"resource\": \"appointments\",\n \"apiEntity\": \"Appointment\",\n \"kind\": \"entity\",\n \"path\": \"Appointments\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"appointments.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"title\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"appointments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ae6ff4b1-553b-48e0-b4fe-00c72964b268\\\",\\\"message\\\":\\\"Value does not exist for the required f\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"billing_codes\": {\n \"resource\": \"billing_codes\",\n \"apiEntity\": \"BillingCode\",\n \"kind\": \"entity\",\n \"path\": \"BillingCodes\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": {\n \"count\": {\n \"kind\": \"unfiltered-blind\",\n \"note\": \"the UNFILTERED billing_codes count/query surface is blind in ww29 (live-verified). Query with `useType` (1 = general, 3 = internal) + `isActive` filters — filtered queries return real data; time_entries.createForResource always applies them for you. get(id) is the authority.\"\n },\n \"query\": {\n \"kind\": \"unfiltered-blind\",\n \"note\": \"the UNFILTERED billing_codes count/query surface is blind in ww29 (live-verified). Query with `useType` (1 = general, 3 = internal) + `isActive` filters — filtered queries return real data; time_entries.createForResource always applies them for you. get(id) is the authority.\"\n }\n },\n \"zoneFacts\": {\n \"quirks\": [\n \"the UNFILTERED count/query surface is blind in this zone — always query with the `useType` (1 = general, 3 = internal) + `isActive` filters (the time_entries.createForResource node rule)\",\n \"the API user cannot create billing codes (userAccessForCreate \\\"None\\\" — live-verified)\"\n ]\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"billing_items\": {\n \"resource\": \"billing_items\",\n \"apiEntity\": \"BillingItems\",\n \"kind\": \"entity\",\n \"path\": \"BillingItems\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"change_request_links\": {\n \"resource\": \"change_request_links\",\n \"apiEntity\": \"ChangeRequestLink\",\n \"kind\": \"entity\",\n \"path\": \"ChangeRequestLinks\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"change_request_links.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"change_request_links.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"2d747061-00ea-4b40-b3fc-740882492457\\\",\\\"message\\\":\\\"Value does not exist for the re\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"checklist_libraries\": {\n \"resource\": \"checklist_libraries\",\n \"apiEntity\": \"ChecklistLibrary\",\n \"kind\": \"entity\",\n \"path\": \"ChecklistLibraries\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"checklist_library_checklist_items\",\n \"apiEntity\": \"ChecklistLibraryChecklistItem\",\n \"parentField\": \"checklistLibraryID\",\n \"parentSegment\": \"ChecklistItems\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"checklist_libraries.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"entityType\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"checklist_library_checklist_items\": {\n \"resource\": \"checklist_library_checklist_items\",\n \"apiEntity\": \"ChecklistLibraryChecklistItem\",\n \"kind\": \"entity\",\n \"path\": \"ChecklistLibraryChecklistItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"checklist_libraries\",\n \"segment\": \"ChecklistItems\",\n \"field\": \"checklistLibraryID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"checklist_library_checklist_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"itemName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"classification_icons\": {\n \"resource\": \"classification_icons\",\n \"apiEntity\": \"ClassificationIcon\",\n \"kind\": \"entity\",\n \"path\": \"ClassificationIcons\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"companies\": {\n \"resource\": \"companies\",\n \"apiEntity\": \"Company\",\n \"kind\": \"entity\",\n \"path\": \"Companies\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"company_alerts\",\n \"apiEntity\": \"CompanyAlert\",\n \"parentField\": \"companyID\",\n \"parentSegment\": \"Alerts\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"company_locations\",\n \"apiEntity\": \"CompanyLocation\",\n \"parentField\": \"companyID\",\n \"parentSegment\": \"Locations\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"company_notes\",\n \"apiEntity\": \"CompanyNote\",\n \"parentField\": \"companyID\",\n \"parentSegment\": \"Notes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"company_site_configurations\",\n \"apiEntity\": \"CompanySiteConfigurations\",\n \"parentField\": \"companyID\",\n \"parentSegment\": \"SiteConfigurations\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"company_webhooks\",\n \"apiEntity\": \"CompanyWebhook\",\n \"parentField\": null,\n \"parentSegment\": \"Webhook\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contacts\",\n \"apiEntity\": \"Contact\",\n \"parentField\": \"companyID\",\n \"parentSegment\": \"Contacts\",\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"specialOps\": [\n \"moveToCompany\",\n \"upsertByEmail\"\n ],\n \"searchCovers\": \"firstName + lastName only (contains, OR-grouped)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"companyName only (contains); no vendor free-text search exists\",\n \"findBy\": []\n },\n \"blindSurfaces\": {\n \"count\": {\n \"kind\": \"unowned-blind\",\n \"note\": \"companies count/query return 0/empty for companies not owned by the caller (ww29, live-verified: 0 before AND after a proven live create). A 0/empty result on this surface proves nothing — get(id) is the authority: it returns the record even while count/query are blind.\"\n },\n \"query\": {\n \"kind\": \"unowned-blind\",\n \"note\": \"companies count/query return 0/empty for companies not owned by the caller (ww29, live-verified: 0 before AND after a proven live create). A 0/empty result on this surface proves nothing — get(id) is the authority: it returns the record even while count/query are blind.\"\n }\n },\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"companyName\",\n \"companyType\",\n \"phone\",\n \"ownerResourceID\"\n ],\n \"quirks\": [\n \"count/query are blind for companies not owned by the caller — get(id) is the authority\",\n \"CompanyModel has NO description field (61 spec properties); the vendor 200s unknown fields silently — a hallucinated field is a no-op\",\n \"ownerResourceID must be an active non-API-only resource (the resources table is blind to the API user — pass a known id, e.g. a ticket assignedResourceID)\",\n \"create auto-creates a vendor-managed \\\"Primary Address\\\" location under the new company (UI-only cleanup)\"\n ],\n \"createGuidance\": {\n \"createOp\": \"companies.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"companyName\",\n \"companyType\",\n \"phone\",\n \"ownerResourceID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 companies); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"companies.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"companies.delete\\\\\\\" — it is not in the capability reg\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for companies (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for companies (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"companyName\"\n },\n \"company_alerts\": {\n \"resource\": \"company_alerts\",\n \"apiEntity\": \"CompanyAlert\",\n \"kind\": \"entity\",\n \"path\": \"CompanyAlerts\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"Alerts\",\n \"field\": \"companyID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"company_alerts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"alertText\",\n \"alertTypeID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"company_alerts.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"company_locations\": {\n \"resource\": \"company_locations\",\n \"apiEntity\": \"CompanyLocation\",\n \"kind\": \"entity\",\n \"path\": \"CompanyLocations\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"Locations\",\n \"field\": \"companyID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"company_locations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"company_notes\": {\n \"resource\": \"company_notes\",\n \"apiEntity\": \"CompanyNote\",\n \"kind\": \"entity\",\n \"path\": \"CompanyNotes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"Notes\",\n \"field\": \"companyID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"company_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"actionType\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"company_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7ef594cb-74dd-4a29-a7f7-2a5d5eb515f0\\\",\\\"message\\\":\\\"Value does not exist for the required \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for company_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for company_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"company_site_configurations\": {\n \"resource\": \"company_site_configurations\",\n \"apiEntity\": \"CompanySiteConfigurations\",\n \"kind\": \"entity\",\n \"path\": \"CompanySiteConfigurations\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"SiteConfigurations\",\n \"field\": \"companyID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"company_webhooks\": {\n \"resource\": \"company_webhooks\",\n \"apiEntity\": \"CompanyWebhook\",\n \"kind\": \"entity\",\n \"path\": \"CompanyWebhooks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"Webhook\",\n \"field\": null\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"company_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"company_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_billing_product_associations\": {\n \"resource\": \"configuration_item_billing_product_associations\",\n \"apiEntity\": \"ConfigurationItemBillingProductAssociations\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemBillingProductAssociations\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"BillingProductAssociations\",\n \"field\": \"configurationItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_billing_product_associations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"billingProductID\",\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the billingProductID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the billingProductID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"billingProductID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_billing_product_associations.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c2bf3080-c882-4ff2-b440-159686687978\\\",\\\"message\\\":\\\"Refe\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_categories\": {\n \"resource\": \"configuration_item_categories\",\n \"apiEntity\": \"ConfigurationItemCategory\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemCategories\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"configuration_item_category_udf_associations\",\n \"apiEntity\": \"ConfigurationItemCategoryUdfAssociation\",\n \"parentField\": \"configurationItemCategoryID\",\n \"parentSegment\": \"UdfAssociations\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_categories.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"displayColorRgb\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for displayColorRgb .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the displayColorRgb reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"displayColorRgb\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for displayColorRgb .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_categories.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"fc4cb7ec-610c-47a3-8625-29b24f253601\\\",\\\"message\\\":\\\"Could not convert stri\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_item_categories (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for configuration_item_categories (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"configuration_item_category_udf_associations\": {\n \"resource\": \"configuration_item_category_udf_associations\",\n \"apiEntity\": \"ConfigurationItemCategoryUdfAssociation\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemCategoryUdfAssociations\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"configuration_item_categories\",\n \"segment\": \"UdfAssociations\",\n \"field\": \"configurationItemCategoryID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_category_udf_associations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"userDefinedFieldDefinitionID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_category_udf_associations.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"89cf29e9-db4a-4834-b5fa-6344d2213569\\\",\\\"message\\\":\\\"Field '\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_dns_records\": {\n \"resource\": \"configuration_item_dns_records\",\n \"apiEntity\": \"ConfigurationItemDnsRecord\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemDnsRecords\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"DnsRecords\",\n \"field\": \"configurationItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_notes\": {\n \"resource\": \"configuration_item_notes\",\n \"apiEntity\": \"ConfigurationItemNote\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemNotes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"Notes\",\n \"field\": \"configurationItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"description\",\n \"noteType\",\n \"title\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for noteType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the noteType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"noteType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for noteType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ec6c5845-d79a-43ec-b4e3-1a0a1d01cc8f\\\",\\\"message\\\":\\\"Field 'title': Missing Requ\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_item_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for configuration_item_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"configuration_item_related_items\": {\n \"resource\": \"configuration_item_related_items\",\n \"apiEntity\": \"ConfigurationItemRelatedItem\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemRelatedItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"RelatedItems\",\n \"field\": \"configurationItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_related_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"relatedConfigurationItemID\",\n \"relationship\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Reference value on field: configurationItemID of type: ConfigurationItem does not exist or is invalid.\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"Reference value on field: configurationItemID of type: ConfigurationItem does not exist or is invalid.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_related_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"20327421-a229-4361-bfe9-c527ec75ae5a\\\",\\\"message\\\":\\\"Reference value on \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_ssl_subject_alternative_names\": {\n \"resource\": \"configuration_item_ssl_subject_alternative_names\",\n \"apiEntity\": \"ConfigurationItemSslSubjectAlternativeName\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemSslSubjectAlternativeNames\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"SslSubjectAlternativeNames\",\n \"field\": \"configurationItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_types\": {\n \"resource\": \"configuration_item_types\",\n \"apiEntity\": \"ConfigurationItemType\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemTypes\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_types.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"configuration_item_types.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_item_webhooks\": {\n \"resource\": \"configuration_item_webhooks\",\n \"apiEntity\": \"ConfigurationItemWebhook\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItemWebhooks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"configuration_items\",\n \"segment\": \"Webhook\",\n \"field\": null\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"configuration_item_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"webhookUrl\",\n \"deactivationUrl\",\n \"secretKey\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_webhooks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"f348c45e-80e0-4632-9dc9-d04796ea03ab\\\",\\\"message\\\":\\\"A ConfigurationItemWebho\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"configuration_items\": {\n \"resource\": \"configuration_items\",\n \"apiEntity\": \"ConfigurationItem\",\n \"kind\": \"entity\",\n \"path\": \"ConfigurationItems\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"configuration_item_billing_product_associations\",\n \"apiEntity\": \"ConfigurationItemBillingProductAssociations\",\n \"parentField\": \"configurationItemID\",\n \"parentSegment\": \"BillingProductAssociations\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"configuration_item_dns_records\",\n \"apiEntity\": \"ConfigurationItemDnsRecord\",\n \"parentField\": \"configurationItemID\",\n \"parentSegment\": \"DnsRecords\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"configuration_item_notes\",\n \"apiEntity\": \"ConfigurationItemNote\",\n \"parentField\": \"configurationItemID\",\n \"parentSegment\": \"Notes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"configuration_item_related_items\",\n \"apiEntity\": \"ConfigurationItemRelatedItem\",\n \"parentField\": \"configurationItemID\",\n \"parentSegment\": \"RelatedItems\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"configuration_item_ssl_subject_alternative_names\",\n \"apiEntity\": \"ConfigurationItemSslSubjectAlternativeName\",\n \"parentField\": \"configurationItemID\",\n \"parentSegment\": \"SslSubjectAlternativeNames\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"configuration_item_webhooks\",\n \"apiEntity\": \"ConfigurationItemWebhook\",\n \"parentField\": null,\n \"parentSegment\": \"Webhook\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"referenceTitle only (contains); serial lookups use resolve / findBySerial\",\n \"findBy\": [\n \"findBySerial\"\n ]\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"companyID\",\n \"productID\",\n \"isActive\"\n ],\n \"quirks\": [\n \"product wall (live-verified ww29): productID must reference an EXISTING Product; products.count is 0 on ww29 (no enumerable id) — this create is UNAVAILABLE in tenants without products\",\n \"configurationItemType is discoverable via configuration_item_types.query (the wall is the FK, not the type)\"\n ],\n \"createGuidance\": {\n \"createOp\": \"configuration_items.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"companyID\",\n \"productID\",\n \"isActive\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9b17f254-654d-4bdc-94bd-d7fc0ff8f4ff\\\",\\\"message\\\":\\\"Value does not exist for the req\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for configuration_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"referenceTitle\"\n },\n \"contact_group_contacts\": {\n \"resource\": \"contact_group_contacts\",\n \"apiEntity\": \"ContactGroupContacts\",\n \"kind\": \"entity\",\n \"path\": \"ContactGroupContacts\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contact_group_contacts.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"NOT_FOUND\\\",\\\"category\\\":\\\"not_found\\\",\\\"retryable\\\":false,\\\"httpStatus\\\":404,\\\"operation\\\":\\\"contact_group_contacts.create\\\",\\\"suggestedAction\\\":\\\"Verify the id, or resolve the record by name first.\\\",\\\"correlationId\\\":\\\"f84411bb-c115-41af-8690-74a6283b9768\\\",\\\"message\\\":\\\"Resource not found: <!DOCTY\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contact_groups\": {\n \"resource\": \"contact_groups\",\n \"apiEntity\": \"ContactGroups\",\n \"kind\": \"entity\",\n \"path\": \"ContactGroups\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contact_groups.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contact_webhooks\": {\n \"resource\": \"contact_webhooks\",\n \"apiEntity\": \"ContactWebhook\",\n \"kind\": \"entity\",\n \"path\": \"ContactWebhooks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contacts\",\n \"segment\": \"Webhook\",\n \"field\": null\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contact_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"contact_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contacts\": {\n \"resource\": \"contacts\",\n \"apiEntity\": \"Contact\",\n \"kind\": \"entity\",\n \"path\": \"Contacts\",\n \"parentScoped\": true,\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"companies\",\n \"segment\": \"Contacts\",\n \"field\": \"companyID\"\n },\n \"children\": [\n {\n \"resource\": \"contact_webhooks\",\n \"apiEntity\": \"ContactWebhook\",\n \"parentField\": null,\n \"parentSegment\": \"Webhook\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"firstName + lastName only (contains, OR-grouped)\",\n \"findBy\": [\n \"findByEmail\"\n ]\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"firstName\",\n \"lastName\",\n \"companyID\",\n \"isActive\"\n ],\n \"quirks\": [\n \"isActive is a NUMBER (1/0) in this zone — a JSON boolean 500s at the vendor parse layer (LocationModel takes a boolean)\",\n \"create is parent-scoped under a company (Companies/{parentId}/Contacts; companyID rides the body)\"\n ],\n \"createGuidance\": {\n \"createOp\": \"contacts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"firstName\",\n \"lastName\",\n \"companyID\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_billing_rules\": {\n \"resource\": \"contract_billing_rules\",\n \"apiEntity\": \"ContractBillingRule\",\n \"kind\": \"entity\",\n \"path\": \"ContractBillingRules\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"BillingRules\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_billing_rules.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"productID\",\n \"isActive\",\n \"startDate\",\n \"determineUnits\",\n \"createChargesAsBillable\",\n \"includeItemsInChargeDescription\",\n \"isDailyProrationEnabled\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382), current full text: 'productID [1] is invalid. Products with a BillingType of 'Standard'[1] cannot be associated to ContractBillingRules.' — a product with an ELIGIBLE (non-Standard) BillingType is required; the products table is blind for this API user — UNSATISFIABLE for this user. (10-04 ladder had stopped at isDailyProrationEnabled + 'productID [1] is invalid. Products with a'.)\",\n \"remedy\": \"a product with a non-Standard BillingType is required (products table blind for this user) — provision/read an eligible product in the Autotask UI or use a user where the products table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_billing_rules.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"62ba9fcf-91ae-42a3-bc50-9911442eb738\\\",\\\"message\\\":\\\"Reference value on field: con\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_block_hour_factors\": {\n \"resource\": \"contract_block_hour_factors\",\n \"apiEntity\": \"ContractBlockHourFactor\",\n \"kind\": \"entity\",\n \"path\": \"ContractBlockHourFactors\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"BlockHourFactors\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_block_hour_factors.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): write path proven via the vendor's unique-key wall — 'A ContractBlockHourFactor for this roleID and contractID combination already exists' (pair (30131842, 29685291) pre-existing from the rates attach). Fields roleID (+ the unique key).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_block_hour_factors.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8095334f-1e14-4185-b5dc-99e5526e526d\\\",\\\"message\\\":\\\"Value does not exist for\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_block_hour_factors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_block_hour_factors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_blocks\": {\n \"resource\": \"contract_blocks\",\n \"apiEntity\": \"ContractBlock\",\n \"kind\": \"entity\",\n \"path\": \"ContractBlocks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Blocks\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_blocks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"hours\",\n \"hourlyRate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114389. TYPE GATE: parent MUST be type 4 (Block hours) — 'This ContractBlock must reference a Contract of type 4 (Block hours) with contractID'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_blocks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ea12c341-d1d3-4622-b73c-45e871ed1f91\\\",\\\"message\\\":\\\"Reference value on field: contractID\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_blocks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_blocks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_charges\": {\n \"resource\": \"contract_charges\",\n \"apiEntity\": \"ContractCharge\",\n \"kind\": \"entity\",\n \"path\": \"ContractCharges\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Charges\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the contracts table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ed78a2ec-b5e2-4e5f-989b-4c39bee66567\\\",\\\"message\\\":\\\"Reference value on field: contractI\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_exclusion_billing_codes\": {\n \"resource\": \"contract_exclusion_billing_codes\",\n \"apiEntity\": \"ContractExclusionBillingCode\",\n \"kind\": \"entity\",\n \"path\": \"ContractExclusionBillingCodes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ExclusionBillingCodes\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_exclusion_billing_codes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field billingCodeID.' — the billing-allocation table is blind for this API user (no resolvable allocation code for this user's contracts) — UNSATISFIABLE for this user.\",\n \"remedy\": \"an allocation code (billingCodeID) readable by this user is required (table blind) — provision in the Autotask UI or use a user where allocation codes are visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_billing_codes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8ef9f8ea-5846-4128-bbcc-b523061c585f\\\",\\\"message\\\":\\\"Reference value on \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_exclusion_roles\": {\n \"resource\": \"contract_exclusion_roles\",\n \"apiEntity\": \"ContractExclusionRoles\",\n \"kind\": \"entity\",\n \"path\": \"ContractExclusionRoles\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ExclusionRoles\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_exclusion_roles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 187; field roleID. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_roles.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"76f0c480-232b-4bfd-aa1e-c9cd3858d717\\\",\\\"message\\\":\\\"Value does not exist for th\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_exclusion_set_excluded_roles\": {\n \"resource\": \"contract_exclusion_set_excluded_roles\",\n \"apiEntity\": \"ContractExclusionSetExcludedRoles\",\n \"kind\": \"entity\",\n \"path\": \"ContractExclusionSetExcludedRoles\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"contract_exclusion_sets\",\n \"segment\": \"ExcludedRoles\",\n \"field\": \"contractExclusionSetID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_exclusion_set_excluded_roles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"excludedRoleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified — batch1-final recovery, id 3; the surviving per-resource receipts predate the recovery)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"csxroles: {\\\"id\\\": 3, \\\"final\\\": \\\"RECOVERED\\\"} (batch1-final.json) — verify-gone=True (batch1-final.log)\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_exclusion_set_excluded_work_types\": {\n \"resource\": \"contract_exclusion_set_excluded_work_types\",\n \"apiEntity\": \"ContractExclusionSetExcludedWorkTypes\",\n \"kind\": \"entity\",\n \"path\": \"ContractExclusionSetExcludedWorkTypes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"contract_exclusion_sets\",\n \"segment\": \"ExcludedWorkTypes\",\n \"field\": \"contractExclusionSetID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_exclusion_set_excluded_work_types.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"excludedWorkTypeID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the excludedWorkTypeID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the excludedWorkTypeID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"excludedWorkTypeID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_set_excluded_work_types.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b900823d-cf16-4eea-a26b-ea1df9b13d70\\\",\\\"message\\\":\\\"Reference\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_exclusion_sets\": {\n \"resource\": \"contract_exclusion_sets\",\n \"apiEntity\": \"ContractExclusionSets\",\n \"kind\": \"entity\",\n \"path\": \"ContractExclusionSets\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"contract_exclusion_set_excluded_roles\",\n \"apiEntity\": \"ContractExclusionSetExcludedRoles\",\n \"parentField\": \"contractExclusionSetID\",\n \"parentSegment\": \"ExcludedRoles\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contract_exclusion_set_excluded_work_types\",\n \"apiEntity\": \"ContractExclusionSetExcludedWorkTypes\",\n \"parentField\": \"contractExclusionSetID\",\n \"parentSegment\": \"ExcludedWorkTypes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_exclusion_sets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_milestones\": {\n \"resource\": \"contract_milestones\",\n \"apiEntity\": \"ContractMilestone\",\n \"kind\": \"entity\",\n \"path\": \"ContractMilestones\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Milestones\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_milestones.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"dateDue\",\n \"amount\",\n \"isInitialPayment\",\n \"status\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 1338. TYPE GATE (vendor): the parent contract MUST be type 3 (Fixed Price) — 'ContractMilestones may only have a contractID linking to Contracts of type 3 (Fixed Price)'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_milestones.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"cfa41884-3855-4729-983f-733f52ef7320\\\",\\\"message\\\":\\\"Reference value on field: contra\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_milestones (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_milestones (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"contract_notes\": {\n \"resource\": \"contract_notes\",\n \"apiEntity\": \"ContractNote\",\n \"kind\": \"entity\",\n \"path\": \"ContractNotes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Notes\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"description\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 35573321 under contract 30131842; fields title + description. Residue (no vendor DELETE).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"bc5bfb0b-79c1-4bde-882b-7cd16c77f6cd\\\",\\\"message\\\":\\\"Reference value on field: contractID \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"contract_rates\": {\n \"resource\": \"contract_rates\",\n \"apiEntity\": \"ContractRate\",\n \"kind\": \"entity\",\n \"path\": \"ContractRates\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Rates\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_rates.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"contractHourlyRate\",\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30083427; fields contractHourlyRate + roleID (an owned/visible role). Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_rates.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"a829126b-68db-4fac-89ba-56c6ad725eef\\\",\\\"message\\\":\\\"Value does not exist for the required\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_rates (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_rates (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_retainers\": {\n \"resource\": \"contract_retainers\",\n \"apiEntity\": \"ContractRetainers\",\n \"kind\": \"entity\",\n \"path\": \"ContractRetainers\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Retainers\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_retainers.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"amount\",\n \"status\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114390. TYPE GATE: parent MUST be type 6 (Retainer). Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_retainers.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d4fb4798-c02b-4c19-b3fa-b1629ae9113a\\\",\\\"message\\\":\\\"Reference value on field: contrac\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_retainers (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_retainers (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_role_costs\": {\n \"resource\": \"contract_role_costs\",\n \"apiEntity\": \"ContractRoleCosts\",\n \"kind\": \"entity\",\n \"path\": \"ContractRoleCosts\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"RoleCosts\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_role_costs.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"rate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"resource-role-pair\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'The specified resourceID and roleID combination is not currently defined.' — a currently-DEFINED (resource, role) assignment is required; the resource_roles table is blind for this user (0 rows) — same pair-validation family as W-A3; UNSATISFIABLE for this user.\",\n \"remedy\": \"a currently-DEFINED (resource, role) assignment is required (resource_roles blind for this user) — same family as W-A3; use a user with readable assignments or manage role costs in the Autotask UI\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_role_costs.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c64d8ace-bdf3-46e9-ba24-1e8989aa73ef\\\",\\\"message\\\":\\\"Value does not exist for the req\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_role_costs (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_role_costs (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_service_adjustments\": {\n \"resource\": \"contract_service_adjustments\",\n \"apiEntity\": \"ContractServiceAdjustment\",\n \"kind\": \"entity\",\n \"path\": \"ContractServiceAdjustments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ServiceAdjustments\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_service_adjustments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382), current full text: the parent contract must be type 7 (Recurring Services) or 'umbrella' ('Unable to create a ContractServiceAdjustment with a contractID that is not of type recurring Service or umbrella'); under a type-7 parent the vendor then requires an ACTIVE serviceID — 'Unable to create a ContractServiceAdjustment with a serviceID of 1 because that Service is not active'. The services table is blind for this API user (no readable active service id) — UNSATISFIABLE for this user.\",\n \"remedy\": \"an ACTIVE serviceID visible to this API user is required (services table blind for this user) — provision the active service in the Autotask UI or use a user where services are readable; parent must be type 7 (Recurring) or 'umbrella'\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_adjustments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"fc363aaa-2d29-4f86-8e8f-2871c6b09401\\\",\\\"message\\\":\\\"Reference value on fiel\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_service_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_service_bundle_adjustments\": {\n \"resource\": \"contract_service_bundle_adjustments\",\n \"apiEntity\": \"ContractServiceBundleAdjustment\",\n \"kind\": \"entity\",\n \"path\": \"ContractServiceBundleAdjustments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ServiceBundleAdjustments\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_service_bundle_adjustments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"W-A7-class drift, re-verified 2026-10-06 (confirm-100 CONF100-1791187382): the vendor answers HTTP 200 with a body that is NOT OperationResultModel — the node (spec-conformant) types INVALID_RESPONSE; the record may be created with an unparseable id (blind table). TYPE GATE: the parent contract must be type 7 (Recurring Services) — '…with a contractID that is not of type recurring Service'. VENDOR-FIX (response shape) required.\",\n \"remedy\": \"vendor response-shape fix required (W-A7-class 200 drift) — treat the INVALID_RESPONSE as the typed wall; parent must be type 7 (Recurring Services); manage the adjustment in the Autotask UI meanwhile\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_bundle_adjustments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"a1899b6f-015a-4c32-aaa8-eabeabb30165\\\",\\\"message\\\":\\\"Reference value \",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Expected OperationResultModel { itemId } (or { id }); got a different shape\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_bundle_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_service_bundle_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_service_bundle_units\": {\n \"resource\": \"contract_service_bundle_units\",\n \"apiEntity\": \"ContractServiceBundleUnit\",\n \"kind\": \"entity\",\n \"path\": \"ContractServiceBundleUnits\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ServiceBundleUnits\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_service_bundles\": {\n \"resource\": \"contract_service_bundles\",\n \"apiEntity\": \"ContractServiceBundle\",\n \"kind\": \"entity\",\n \"path\": \"ContractServiceBundles\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ServiceBundles\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_service_bundles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field serviceBundleID.' — the service-bundles table is blind for this API user — UNSATISFIABLE for this user.\",\n \"remedy\": \"a service-bundles-table record visible to this user is required (table blind, 0 rows) — provision in the Autotask UI or use a user where the table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_bundles.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"032e3caa-4527-467f-b459-0cb80cfd1ad2\\\",\\\"message\\\":\\\"Value does not exist for th\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_bundles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_service_bundles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_service_units\": {\n \"resource\": \"contract_service_units\",\n \"apiEntity\": \"ContractServiceUnit\",\n \"kind\": \"entity\",\n \"path\": \"ContractServiceUnits\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"ServiceUnits\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"contract_services\": {\n \"resource\": \"contract_services\",\n \"apiEntity\": \"ContractService\",\n \"kind\": \"entity\",\n \"path\": \"ContractServices\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"Services\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_services.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field serviceID.' — the services table is blind for this API user (0 rows; no readable service id) — UNSATISFIABLE for this user.\",\n \"remedy\": \"a services-table record visible to this user is required (table blind, 0 rows) — provision in the Autotask UI or use a user where the table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_services.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c5003db3-bd6a-4970-aeb7-c13b32849acd\\\",\\\"message\\\":\\\"Value does not exist for the requi\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contract_ticket_purchases\": {\n \"resource\": \"contract_ticket_purchases\",\n \"apiEntity\": \"ContractTicketPurchases\",\n \"kind\": \"entity\",\n \"path\": \"ContractTicketPurchases\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"contracts\",\n \"segment\": \"TicketPurchases\",\n \"field\": \"contractID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contract_ticket_purchases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"ticketsPurchased\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"perTicketRate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114391. TYPE GATE: parent MUST be type 8 (PerTicket incident) — 'The Contract associated by contractID must be of type PerTicket (incident)'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_ticket_purchases.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"268901a8-7fdd-4e9a-9731-92f840ac73bd\\\",\\\"message\\\":\\\"Reference value on field: \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_ticket_purchases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contract_ticket_purchases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"contracts\": {\n \"resource\": \"contracts\",\n \"apiEntity\": \"Contract\",\n \"kind\": \"entity\",\n \"path\": \"Contracts\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"contract_billing_rules\",\n \"apiEntity\": \"ContractBillingRule\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"BillingRules\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contract_block_hour_factors\",\n \"apiEntity\": \"ContractBlockHourFactor\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"BlockHourFactors\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_blocks\",\n \"apiEntity\": \"ContractBlock\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Blocks\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_charges\",\n \"apiEntity\": \"ContractCharge\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Charges\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contract_exclusion_billing_codes\",\n \"apiEntity\": \"ContractExclusionBillingCode\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ExclusionBillingCodes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contract_exclusion_roles\",\n \"apiEntity\": \"ContractExclusionRoles\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ExclusionRoles\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"contract_milestones\",\n \"apiEntity\": \"ContractMilestone\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Milestones\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_notes\",\n \"apiEntity\": \"ContractNote\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Notes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_rates\",\n \"apiEntity\": \"ContractRate\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Rates\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_retainers\",\n \"apiEntity\": \"ContractRetainers\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Retainers\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_role_costs\",\n \"apiEntity\": \"ContractRoleCosts\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"RoleCosts\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_service_adjustments\",\n \"apiEntity\": \"ContractServiceAdjustment\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ServiceAdjustments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": false,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_service_bundle_adjustments\",\n \"apiEntity\": \"ContractServiceBundleAdjustment\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ServiceBundleAdjustments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": false,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_service_bundle_units\",\n \"apiEntity\": \"ContractServiceBundleUnit\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ServiceBundleUnits\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_service_bundles\",\n \"apiEntity\": \"ContractServiceBundle\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ServiceBundles\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_service_units\",\n \"apiEntity\": \"ContractServiceUnit\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"ServiceUnits\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_services\",\n \"apiEntity\": \"ContractService\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"Services\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"contract_ticket_purchases\",\n \"apiEntity\": \"ContractTicketPurchases\",\n \"parentField\": \"contractID\",\n \"parentSegment\": \"TicketPurchases\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"contractName only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"contracts.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"status\",\n \"contractType\",\n \"contractName\",\n \"startDate\",\n \"endDate\",\n \"timeReportingRequiresStartAndStopTimes\",\n \"companyID\",\n \"estimatedRevenue\",\n \"estimatedHours\",\n \"estimatedCost\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100, marker CONF100-1791187382): the W-A6 'blind parent' was companyID — an OWNED company satisfies it (seed 30132785). Proven contractType values: 1, 3 (Fixed Price), 4 (Block hours), 6 (Retainer), 7 (Recurring Services), 8 (PerTicket incident); type 5 is an invalid picklist value. Type-specific extra fields: types 1/3/4/6/8 require estimatedRevenue (type 1 additionally estimatedHours + estimatedCost); type 7 additionally contractPeriodType (2 valid) + setupFee. Proven ids 30131842-30131847 (residue — no vendor DELETE for contracts).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contracts.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"25d4a730-6d6c-49ff-a038-96d3fd09165d\\\",\\\"message\\\":\\\"Value does not exist for the required fiel\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100 (CONF100-1791187382)\\\", \\\"result\\\": \\\"OperationResultModel id=30131842 (type 1)\\\", \\\"ladder\\\": \\\"status -> endDate/timeReporting/contractType/contractName/startDate -> 'Contracts of type 1 require an estimatedRevenue' -> estimatedHours -> estimatedCost\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contracts (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for contracts (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"contractName\"\n },\n \"countries\": {\n \"resource\": \"countries\",\n \"apiEntity\": \"Country\",\n \"kind\": \"entity\",\n \"path\": \"Countries\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"departments\": {\n \"resource\": \"departments\",\n \"apiEntity\": \"Department\",\n \"kind\": \"entity\",\n \"path\": \"Departments\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"departments.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"primaryLocationID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for primaryLocationID.\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the primaryLocationID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"primaryLocationID\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for primaryLocationID.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"departments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"4197e8a1-0411-45cb-b4a1-e770f4bae5e9\\\",\\\"message\\\":\\\"Value does not reference an existing ent\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for departments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for departments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"domain_registrars\": {\n \"resource\": \"domain_registrars\",\n \"apiEntity\": \"DomainRegistrar\",\n \"kind\": \"entity\",\n \"path\": \"DomainRegistrars\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"domain_registrars.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 domain_registrars); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"domain_registrars.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"domain_registrars.delete\\\\\\\" — it is not in th\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for domain_registrars (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for domain_registrars (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"expense_item_attachments\": {\n \"resource\": \"expense_item_attachments\",\n \"apiEntity\": \"ExpenseItemAttachment\",\n \"kind\": \"entity\",\n \"path\": \"ExpenseItemAttachments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"expense_items\",\n \"segment\": \"Attachments\",\n \"field\": \"expenseItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"expense_item_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"Field 'Type': Missing Required Field: Type.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\",\n \"referenceField\": \"Type\"\n },\n \"vendorEvidence\": [\n \"Field 'Type': Missing Required Field: Type.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_item_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c4c16666-8398-48ea-88e2-fd6236d1a447\\\",\\\"message\\\":\\\"Field 'Type': Missing Requi\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"expense_items\": {\n \"resource\": \"expense_items\",\n \"apiEntity\": \"ExpenseItem\",\n \"kind\": \"entity\",\n \"path\": \"ExpenseItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"expense_reports\",\n \"segment\": \"Items\",\n \"field\": \"expenseReportID\"\n },\n \"children\": [\n {\n \"resource\": \"expense_item_attachments\",\n \"apiEntity\": \"ExpenseItemAttachment\",\n \"parentField\": \"expenseItemID\",\n \"parentSegment\": \"Attachments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"download\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"expense_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"paymentType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the expense_reports table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"178f9509-d97a-4e69-9e4b-f7af67d98e64\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for expense_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for expense_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"expense_reports\": {\n \"resource\": \"expense_reports\",\n \"apiEntity\": \"ExpenseReport\",\n \"kind\": \"entity\",\n \"path\": \"ExpenseReports\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"expense_items\",\n \"apiEntity\": \"ExpenseItem\",\n \"parentField\": \"expenseReportID\",\n \"parentSegment\": \"Items\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"expense_reports.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"weekEnding\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_reports.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9363affe-7779-4bac-bd81-49423574fbc8\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for expense_reports (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for expense_reports (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"holiday_sets\": {\n \"resource\": \"holiday_sets\",\n \"apiEntity\": \"HolidaySet\",\n \"kind\": \"entity\",\n \"path\": \"HolidaySets\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"holidays\",\n \"apiEntity\": \"Holiday\",\n \"parentField\": \"holidaySetID\",\n \"parentSegment\": \"Holidays\",\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"holiday_sets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"holidaySetName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"holidays\": {\n \"resource\": \"holidays\",\n \"apiEntity\": \"Holiday\",\n \"kind\": \"entity\",\n \"path\": \"Holidays\",\n \"parentScoped\": true,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"holiday_sets\",\n \"segment\": \"Holidays\",\n \"field\": \"holidaySetID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"holidays.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"holidayName\",\n \"holidayDate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"invoices\": {\n \"resource\": \"invoices\",\n \"apiEntity\": \"Invoice\",\n \"kind\": \"entity\",\n \"path\": \"Invoices\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"notification_history\": {\n \"resource\": \"notification_history\",\n \"apiEntity\": \"NotificationHistory\",\n \"kind\": \"entity\",\n \"path\": \"NotificationHistory\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"opportunities\": {\n \"resource\": \"opportunities\",\n \"apiEntity\": \"Opportunity\",\n \"kind\": \"entity\",\n \"path\": \"Opportunities\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"opportunity_attachments\",\n \"apiEntity\": \"OpportunityAttachment\",\n \"parentField\": \"opportunityID\",\n \"parentSegment\": \"Attachments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"download\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"opportunities.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"name\",\n \"title\",\n \"companyID\",\n \"ownerResourceID\",\n \"amount\",\n \"cost\",\n \"startDate\",\n \"projectedCloseDate\",\n \"stage\",\n \"status\",\n \"probability\",\n \"useQuoteTotals\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"undocumented-ladder\",\n \"message\": \"Field 'useQuoteTotals': Missing Required Field: useQuoteTotals. | Value does not exist for the required field useQuoteTotals. \",\n \"remedy\": \"the vendor required-field ladder is undocumented and UNPROVEN (12 fields consumed before the campaign stopped — W-A5); no known field set makes this create succeed on ww29 — treat it as unavailable for this tenant and file the gap with the vendor.\"\n },\n \"vendorEvidence\": [\n \"Field 'useQuoteTotals': Missing Required Field: useQuoteTotals. | Value does not exist for the required field useQuoteTotals. \",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"opportunities.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b18b6fa2-5fba-4cbe-8657-b2805798c736\\\",\\\"message\\\":\\\"Field 'startDate': Missing Required Fi\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for opportunities (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for opportunities (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"opportunity_attachments\": {\n \"resource\": \"opportunity_attachments\",\n \"apiEntity\": \"OpportunityAttachment\",\n \"kind\": \"entity\",\n \"path\": \"OpportunityAttachments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"opportunities\",\n \"segment\": \"Attachments\",\n \"field\": \"opportunityID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"opportunity_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"vendor 500: the Type picklist values are not exposed to this API user (File/Document/Image/Other all rejected — W-A4)\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\",\n \"referenceField\": \"Type\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"opportunity_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"83dcbf4f-7e56-4602-b52b-04db2f3455d2\\\",\\\"message\\\":\\\"Field 'Type': Missing Requir\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"opportunity_categories\": {\n \"resource\": \"opportunity_categories\",\n \"apiEntity\": \"OpportunityCategory\",\n \"kind\": \"entity\",\n \"path\": \"OpportunityCategories\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"product_vendors\": {\n \"resource\": \"product_vendors\",\n \"apiEntity\": \"ProductVendors\",\n \"kind\": \"entity\",\n \"path\": \"ProductVendors\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"products\",\n \"segment\": \"Vendors\",\n \"field\": \"productID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"product_vendors.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isDefault\",\n \"isActive\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the products table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"product_vendors.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9aecd016-c8fa-4940-b54a-6e875d43aba7\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for product_vendors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for product_vendors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"products\": {\n \"resource\": \"products\",\n \"apiEntity\": \"Product\",\n \"kind\": \"entity\",\n \"path\": \"Products\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"product_vendors\",\n \"apiEntity\": \"ProductVendors\",\n \"parentField\": \"productID\",\n \"parentSegment\": \"Vendors\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"quirks\": [\n \"products.count is 0 in this zone (blind surface, no enumerable id) — this is the configuration_items.create product wall\"\n ],\n \"createGuidance\": {\n \"createOp\": \"products.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"isSerialized\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"products.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"3f1bd9a6-28bb-4fb4-b851-07b5f90a8a3d\\\",\\\"message\\\":\\\"Value does not exist for the required field\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for products (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for products (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"project_charges\": {\n \"resource\": \"project_charges\",\n \"apiEntity\": \"ProjectCharge\",\n \"kind\": \"entity\",\n \"path\": \"ProjectCharges\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"projects\",\n \"segment\": \"Charges\",\n \"field\": \"projectID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"project_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the projects table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"project_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"664ab2ea-408f-4834-a331-eb5dd55ac557\\\",\\\"message\\\":\\\"A productID or a billingCodeID must \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"project_notes\": {\n \"resource\": \"project_notes\",\n \"apiEntity\": \"ProjectNote\",\n \"kind\": \"entity\",\n \"path\": \"ProjectNotes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"projects\",\n \"segment\": \"Notes\",\n \"field\": \"projectID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"project_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"noteType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"project_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d11a453b-729e-4908-8c6d-8549b72e8d0c\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for project_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for project_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"phases\": {\n \"resource\": \"phases\",\n \"apiEntity\": \"Phase\",\n \"kind\": \"entity\",\n \"path\": \"Phases\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"projects\",\n \"segment\": \"Phases\",\n \"field\": \"projectID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"phases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (known id 527128, marker name FULL100W-1791110339 phases); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"residue.json: phases id 527128 (known id, undeletable by vendor wall W-A1; phases.get is scoped — the id is retained in the ledger)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for phases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for phases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"tasks\": {\n \"resource\": \"tasks\",\n \"apiEntity\": \"Task\",\n \"kind\": \"entity\",\n \"path\": \"Tasks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"projects\",\n \"segment\": \"Tasks\",\n \"field\": \"projectID\"\n },\n \"children\": [\n {\n \"resource\": \"task_secondary_resources\",\n \"apiEntity\": \"TaskSecondaryResource\",\n \"parentField\": \"taskID\",\n \"parentSegment\": \"SecondaryResources\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"title only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"projectID\",\n \"taskType\",\n \"status\",\n \"title\"\n ],\n \"quirks\": [\n \"projectID is required IN THE BODY (the scoped parent path carries the parent too)\",\n \"taskType is an integer picklist (1/2)\"\n ],\n \"createGuidance\": {\n \"createOp\": \"tasks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"projectID\",\n \"taskType\",\n \"status\",\n \"title\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for taskType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the taskType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"taskType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for taskType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"tasks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"4d283916-ab65-46c5-b17b-4eafda10c3ac\\\",\\\"message\\\":\\\"Value does not reference an existing entity fo\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for tasks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for tasks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"projects\": {\n \"resource\": \"projects\",\n \"apiEntity\": \"Project\",\n \"kind\": \"entity\",\n \"path\": \"Projects\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"phases\",\n \"apiEntity\": \"Phase\",\n \"parentField\": \"projectID\",\n \"parentSegment\": \"Phases\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"project_charges\",\n \"apiEntity\": \"ProjectCharge\",\n \"parentField\": \"projectID\",\n \"parentSegment\": \"Charges\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"project_notes\",\n \"apiEntity\": \"ProjectNote\",\n \"parentField\": \"projectID\",\n \"parentSegment\": \"Notes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"tasks\",\n \"apiEntity\": \"Task\",\n \"parentField\": \"projectID\",\n \"parentSegment\": \"Tasks\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"title only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"projectName only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"quirks\": [\n \"proven live create body (ww29): projectName, description, companyID (0 = tenant-global), projectType 2, status 1, startDateTime, endDateTime — per-field minimality was not isolated live, so keep the full shape\"\n ],\n \"createGuidance\": {\n \"createOp\": \"projects.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"projectName\",\n \"startDateTime\",\n \"endDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for projectType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the projectType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"projectType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for projectType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"projects.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7a611ce5-b863-460d-8911-f850d546fd0a\\\",\\\"message\\\":\\\"Field 'endDateTime': Missing Required Field\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for projects (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for projects (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"projectName\"\n },\n \"purchase_approvals\": {\n \"resource\": \"purchase_approvals\",\n \"apiEntity\": \"PurchaseApprovals\",\n \"kind\": \"entity\",\n \"path\": \"PurchaseApprovals\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"purchase_order_item_receiving\": {\n \"resource\": \"purchase_order_item_receiving\",\n \"apiEntity\": \"PurchaseOrderItemReceiving\",\n \"kind\": \"entity\",\n \"path\": \"PurchaseOrderItemReceiving\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"purchase_order_items\",\n \"segment\": \"Receiving\",\n \"field\": \"purchaseOrderItemID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"purchase_order_item_receiving.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"quantityNowReceiving\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 purchase_order_item_receiving); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"not found on a visible surface (record may predate the marker value or was created with a different value)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_order_item_receiving (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for purchase_order_item_receiving (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"purchase_order_items\": {\n \"resource\": \"purchase_order_items\",\n \"apiEntity\": \"PurchaseOrderItems\",\n \"kind\": \"entity\",\n \"path\": \"PurchaseOrderItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"purchase_orders\",\n \"segment\": \"Items\",\n \"field\": \"orderID\"\n },\n \"children\": [\n {\n \"resource\": \"purchase_order_item_receiving\",\n \"apiEntity\": \"PurchaseOrderItemReceiving\",\n \"parentField\": \"purchaseOrderItemID\",\n \"parentSegment\": \"Receiving\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"purchase_order_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitCost\",\n \"quantity\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"vendor 500: reference rejection on order (exact vendor text preserved verbatim in vendorEvidence — campaign receipt artifact, as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"purchase_order_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"1a4f90a8-2add-47f3-bc93-74e972f7fb5e\\\",\\\"message\\\":\\\"Reference value on field: order\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_order_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for purchase_order_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"purchase_orders\": {\n \"resource\": \"purchase_orders\",\n \"apiEntity\": \"PurchaseOrders\",\n \"kind\": \"entity\",\n \"path\": \"PurchaseOrders\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"purchase_order_items\",\n \"apiEntity\": \"PurchaseOrderItems\",\n \"parentField\": \"orderID\",\n \"parentSegment\": \"Items\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"purchase_orders.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"shipToAddress1\",\n \"status\",\n \"shipToName\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"purchase_orders.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8cefa9ef-8cfd-46b3-baef-fe64b3d2b999\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_orders (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for purchase_orders (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"quote_items\": {\n \"resource\": \"quote_items\",\n \"apiEntity\": \"QuoteItem\",\n \"kind\": \"entity\",\n \"path\": \"QuoteItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"quotes\",\n \"segment\": \"Items\",\n \"field\": \"quoteID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"quote_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isOptional\",\n \"unitDiscount\",\n \"quantity\",\n \"quoteItemType\",\n \"lineDiscount\",\n \"percentageDiscount\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the quotes table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"quote_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"0645cad1-5749-42f1-9666-eeffac24118b\\\",\\\"message\\\":\\\"Reference value on field: quoteID of quo\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"quote_locations\": {\n \"resource\": \"quote_locations\",\n \"apiEntity\": \"QuoteLocation\",\n \"kind\": \"entity\",\n \"path\": \"QuoteLocations\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"quotes\",\n \"segment\": \"Locations\",\n \"field\": \"quoteID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"quote_locations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"quote_locations.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for quote_locations (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for quote_locations (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"quote_templates\": {\n \"resource\": \"quote_templates\",\n \"apiEntity\": \"QuoteTemplate\",\n \"kind\": \"entity\",\n \"path\": \"QuoteTemplates\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"quotes\": {\n \"resource\": \"quotes\",\n \"apiEntity\": \"Quote\",\n \"kind\": \"entity\",\n \"path\": \"Quotes\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"quote_items\",\n \"apiEntity\": \"QuoteItem\",\n \"parentField\": \"quoteID\",\n \"parentSegment\": \"Items\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"quote_locations\",\n \"apiEntity\": \"QuoteLocation\",\n \"parentField\": \"quoteID\",\n \"parentSegment\": \"Locations\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"quotes.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"effectiveDate\",\n \"expirationDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"quotes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7db33388-b040-4940-9def-9f4a4b46acb8\\\",\\\"message\\\":\\\"Value does not exist for the required field b\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for quotes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for quotes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"resource_role_queues\": {\n \"resource\": \"resource_role_queues\",\n \"apiEntity\": \"ResourceRoleQueue\",\n \"kind\": \"entity\",\n \"path\": \"ResourceRoleQueues\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"RoleQueues\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"resource_role_queues.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"queueID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 resource_role_queues); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"BLIND SURFACE — own created records invisible to query (node sentinel, ww29-verified)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for resource_role_queues (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for resource_role_queues (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"resource_roles\": {\n \"resource\": \"resource_roles\",\n \"apiEntity\": \"ResourceRole\",\n \"kind\": \"entity\",\n \"path\": \"ResourceRoles\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"Roles\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"resource_skills\": {\n \"resource\": \"resource_skills\",\n \"apiEntity\": \"ResourceSkill\",\n \"kind\": \"entity\",\n \"path\": \"ResourceSkills\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"Skills\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"resource_time_off_additional\": {\n \"resource\": \"resource_time_off_additional\",\n \"apiEntity\": \"ResourceTimeOffAdditional\",\n \"kind\": \"entity\",\n \"path\": \"ResourceTimeOffAdditional\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"TimeOffAdditional\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"resource_time_off_approvers\": {\n \"resource\": \"resource_time_off_approvers\",\n \"apiEntity\": \"ResourceTimeOffApprover\",\n \"kind\": \"entity\",\n \"path\": \"ResourceTimeOffApprovers\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"TimeOffApprovers\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"resource_time_off_balances\": {\n \"resource\": \"resource_time_off_balances\",\n \"apiEntity\": \"ResourceTimeOffBalance\",\n \"kind\": \"entity\",\n \"path\": \"ResourceTimeOffBalances\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"resources\",\n \"segment\": \"TimeOffBalances\",\n \"field\": \"resourceID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"resources\": {\n \"resource\": \"resources\",\n \"apiEntity\": \"Resource\",\n \"kind\": \"entity\",\n \"path\": \"Resources\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"resource_role_queues\",\n \"apiEntity\": \"ResourceRoleQueue\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"RoleQueues\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"resource_roles\",\n \"apiEntity\": \"ResourceRole\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"Roles\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"resource_skills\",\n \"apiEntity\": \"ResourceSkill\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"Skills\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"resource_time_off_additional\",\n \"apiEntity\": \"ResourceTimeOffAdditional\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"TimeOffAdditional\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"getByResource\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": false,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"resource_time_off_approvers\",\n \"apiEntity\": \"ResourceTimeOffApprover\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"TimeOffApprovers\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"resource_time_off_balances\",\n \"apiEntity\": \"ResourceTimeOffBalance\",\n \"parentField\": \"resourceID\",\n \"parentSegment\": \"TimeOffBalances\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"getByResource\",\n \"getByYear\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": false,\n \"update\": false,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"firstName + lastName only (contains, OR-grouped)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"quirks\": [\n \"the resources table is blind to this API user: count/query return 0; the API user's own id is visible only via resources.whoAmI (the API-only identity)\",\n \"POST /V1.0/Resources 405s at the method level — no resource creation via REST at all (the registry has no resources.create op)\"\n ]\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"roles\": {\n \"resource\": \"roles\",\n \"apiEntity\": \"Role\",\n \"kind\": \"entity\",\n \"path\": \"Roles\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"roles.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"hourlyFactor\",\n \"hourlyRate\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 roles); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"roles.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"roles.delete\\\\\\\" — it is not in the capability registry (l\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for roles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for roles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"service_call_task_resources\": {\n \"resource\": \"service_call_task_resources\",\n \"apiEntity\": \"ServiceCallTaskResource\",\n \"kind\": \"entity\",\n \"path\": \"ServiceCallTaskResources\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"service_call_tasks\",\n \"segment\": \"Resources\",\n \"field\": \"serviceCallTaskID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"service_call_task_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_call_tasks table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_task_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"33baa2f9-f98c-49cd-ac9e-ef1ac532e277\\\",\\\"message\\\":\\\"Value does not exist for\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"service_call_tasks\": {\n \"resource\": \"service_call_tasks\",\n \"apiEntity\": \"ServiceCallTask\",\n \"kind\": \"entity\",\n \"path\": \"ServiceCallTasks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"service_calls\",\n \"segment\": \"Tasks\",\n \"field\": \"serviceCallID\"\n },\n \"children\": [\n {\n \"resource\": \"service_call_task_resources\",\n \"apiEntity\": \"ServiceCallTaskResource\",\n \"parentField\": \"serviceCallTaskID\",\n \"parentSegment\": \"Resources\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"service_call_tasks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_calls table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_tasks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"49bf54fb-1e7f-40a9-82e0-25c58a4a67fd\\\",\\\"message\\\":\\\"Value does not exist for the requ\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"service_call_ticket_resources\": {\n \"resource\": \"service_call_ticket_resources\",\n \"apiEntity\": \"ServiceCallTicketResource\",\n \"kind\": \"entity\",\n \"path\": \"ServiceCallTicketResources\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"service_call_tickets\",\n \"segment\": \"Resources\",\n \"field\": \"serviceCallTicketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"service_call_ticket_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_call_tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_ticket_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9e96c2d1-9fcb-4d73-95dd-f88c1ce7de6c\\\",\\\"message\\\":\\\"Value does not exist f\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"service_call_tickets\": {\n \"resource\": \"service_call_tickets\",\n \"apiEntity\": \"ServiceCallTicket\",\n \"kind\": \"entity\",\n \"path\": \"ServiceCallTickets\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"service_calls\",\n \"segment\": \"Tickets\",\n \"field\": \"serviceCallID\"\n },\n \"children\": [\n {\n \"resource\": \"service_call_ticket_resources\",\n \"apiEntity\": \"ServiceCallTicketResource\",\n \"parentField\": \"serviceCallTicketID\",\n \"parentSegment\": \"Resources\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"service_call_tickets.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_calls table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_tickets.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"62ab38e3-b14b-4462-829a-9abc91ce3eb3\\\",\\\"message\\\":\\\"Value does not exist for the re\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"service_calls\": {\n \"resource\": \"service_calls\",\n \"apiEntity\": \"ServiceCall\",\n \"kind\": \"entity\",\n \"path\": \"ServiceCalls\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"service_call_tasks\",\n \"apiEntity\": \"ServiceCallTask\",\n \"parentField\": \"serviceCallID\",\n \"parentSegment\": \"Tasks\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"service_call_tickets\",\n \"apiEntity\": \"ServiceCallTicket\",\n \"parentField\": \"serviceCallID\",\n \"parentSegment\": \"Tickets\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"service_calls.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_calls.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"27ef068e-2ff8-4bf9-9043-a17008996639\\\",\\\"message\\\":\\\"Value does not exist for the required \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"service_level_agreement_results\": {\n \"resource\": \"service_level_agreement_results\",\n \"apiEntity\": \"ServiceLevelAgreementResults\",\n \"kind\": \"entity\",\n \"path\": \"ServiceLevelAgreementResults\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"services\": {\n \"resource\": \"services\",\n \"apiEntity\": \"Service\",\n \"kind\": \"entity\",\n \"path\": \"Services\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"services.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"periodType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"services.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"eb4c0dfd-6d14-4af2-8770-7bd7fc06d0eb\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for perio\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"name\"\n },\n \"skills\": {\n \"resource\": \"skills\",\n \"apiEntity\": \"Skill\",\n \"kind\": \"entity\",\n \"path\": \"Skills\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"subscription_periods\": {\n \"resource\": \"subscription_periods\",\n \"apiEntity\": \"SubscriptionPeriod\",\n \"kind\": \"entity\",\n \"path\": \"SubscriptionPeriods\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"subscriptions\": {\n \"resource\": \"subscriptions\",\n \"apiEntity\": \"Subscription\",\n \"kind\": \"entity\",\n \"path\": \"Subscriptions\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"subscriptions.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"subscriptionName\",\n \"configurationItemID\",\n \"periodPrice\",\n \"periodType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the configurationItemID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"subscriptions.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"36080c8a-2fd5-4fc3-9c0f-a53d95fa97b2\\\",\\\"message\\\":\\\"Value does not reference an existing e\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"survey_results\": {\n \"resource\": \"survey_results\",\n \"apiEntity\": \"SurveyResults\",\n \"kind\": \"entity\",\n \"path\": \"SurveyResults\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"surveys\": {\n \"resource\": \"surveys\",\n \"apiEntity\": \"Survey\",\n \"kind\": \"entity\",\n \"path\": \"Surveys\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"tag_aliases\": {\n \"resource\": \"tag_aliases\",\n \"apiEntity\": \"TagAlias\",\n \"kind\": \"entity\",\n \"path\": \"TagAliases\",\n \"parentScoped\": true,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"tags\",\n \"segment\": \"Aliases\",\n \"field\": \"tagID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"tag_aliases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"tag_groups\": {\n \"resource\": \"tag_groups\",\n \"apiEntity\": \"TagGroup\",\n \"kind\": \"entity\",\n \"path\": \"TagGroups\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"tag_groups.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"label\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"tags\": {\n \"resource\": \"tags\",\n \"apiEntity\": \"Tag\",\n \"kind\": \"entity\",\n \"path\": \"Tags\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"tag_aliases\",\n \"apiEntity\": \"TagAlias\",\n \"parentField\": \"tagID\",\n \"parentSegment\": \"Aliases\",\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"tags.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"label\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"task_secondary_resources\": {\n \"resource\": \"task_secondary_resources\",\n \"apiEntity\": \"TaskSecondaryResource\",\n \"kind\": \"entity\",\n \"path\": \"TaskSecondaryResources\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tasks\",\n \"segment\": \"SecondaryResources\",\n \"field\": \"taskID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"task_secondary_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"vendor 500: reference rejection on r (exact vendor text preserved verbatim in vendorEvidence — campaign receipt artifact, as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"task_secondary_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d2783d1d-b23a-4c7d-9459-0089be7f9b0b\\\",\\\"message\\\":\\\"Reference value on field: r\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_additional_configuration_items\": {\n \"resource\": \"ticket_additional_configuration_items\",\n \"apiEntity\": \"TicketAdditionalConfigurationItem\",\n \"kind\": \"entity\",\n \"path\": \"TicketAdditionalConfigurationItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"AdditionalConfigurationItems\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_additional_configuration_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"configurationItemID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the configurationItemID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_additional_configuration_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"20c78cfe-eb8c-437b-9f41-8a3cd852b05b\\\",\\\"message\\\":\\\"Reference valu\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_additional_contacts\": {\n \"resource\": \"ticket_additional_contacts\",\n \"apiEntity\": \"TicketAdditionalContact\",\n \"kind\": \"entity\",\n \"path\": \"TicketAdditionalContacts\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"AdditionalContacts\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_additional_contacts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"contactID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 4001 (deleted post-proof — zero residue). The 10-04 W-A2 'blind reference' was a company-scoping issue, NOT a blind table: 'The contactID is invalid. The contactID must be associated with either the Ticket's Company or its Parent Company.' A contact created under the ticket's own company (30132787 for ticket 527119) passes.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"Reference value on field: contactID of type: Contact does not exist or is invalid.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_additional_contacts.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"f507450d-002a-4f1a-afc8-d0168a45f93d\\\",\\\"message\\\":\\\"Reference value on field:\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_attachments\": {\n \"resource\": \"ticket_attachments\",\n \"apiEntity\": \"TicketAttachment\",\n \"kind\": \"entity\",\n \"path\": \"TicketAttachments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"Attachments\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"Picklist value [File] does not exist for Type.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"077617d5-48c2-4ca2-a610-8bd1e0da97d4\\\",\\\"message\\\":\\\"Field 'Type': Missing Required Fi\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Picklist value [0] does not exist for Publish. / Field 'Type': Missing Required Field: Type.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_categories\": {\n \"resource\": \"ticket_categories\",\n \"apiEntity\": \"TicketCategory\",\n \"kind\": \"entity\",\n \"path\": \"TicketCategories\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"ticket_category_field_defaults\",\n \"apiEntity\": \"TicketCategoryFieldDefault\",\n \"parentField\": \"ticketCategoryID\",\n \"parentSegment\": \"FieldDefaults\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": false,\n \"query\": true,\n \"update\": false,\n \"delete\": false\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_category_field_defaults\": {\n \"resource\": \"ticket_category_field_defaults\",\n \"apiEntity\": \"TicketCategoryFieldDefault\",\n \"kind\": \"entity\",\n \"path\": \"TicketCategoryFieldDefaults\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"ticket_categories\",\n \"segment\": \"FieldDefaults\",\n \"field\": \"ticketCategoryID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_change_request_approvals\": {\n \"resource\": \"ticket_change_request_approvals\",\n \"apiEntity\": \"TicketChangeRequestApproval\",\n \"kind\": \"entity\",\n \"path\": \"TicketChangeRequestApprovals\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"ChangeRequestApprovals\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_change_request_approvals.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_change_request_approvals.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"dcc063e9-eaf1-4e66-9bc9-cb5c4a4f3f71\\\",\\\"message\\\":\\\"The Ticket id you ha\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_charges\": {\n \"resource\": \"ticket_charges\",\n \"apiEntity\": \"TicketCharge\",\n \"kind\": \"entity\",\n \"path\": \"TicketCharges\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"Charges\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b9b6939b-ccc5-4e9d-9ea2-e2f47d064f63\\\",\\\"message\\\":\\\"A productID or a billingCodeID must b\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_checklist_items\": {\n \"resource\": \"ticket_checklist_items\",\n \"apiEntity\": \"TicketChecklistItem\",\n \"kind\": \"entity\",\n \"path\": \"TicketChecklistItems\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"ChecklistItems\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_checklist_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"itemName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_checklist_libraries\": {\n \"resource\": \"ticket_checklist_libraries\",\n \"apiEntity\": \"TicketChecklistLibrary\",\n \"kind\": \"entity\",\n \"path\": \"TicketChecklistLibraries\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"ChecklistLibraries\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_checklist_libraries.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"checklistLibraryID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"W-A7 drift + parent wall, re-verified 2026-10-06 (confirm-100 CONF100-1791187382): the vendor now answers HTML 404 ('Resource not found' — typed NOT_FOUND by the node) for checklistLibraryID=1: the checklist-library PARENT is blind/absent for this API user before the 10-04 200-shape drift can surface. The responseDrift pin remains for the post-parent shape.\",\n \"remedy\": \"the checklist-library PARENT is blind for this user (HTML 404 before the 200 drift) — provision the library in the Autotask UI or use a user where the table is visible; the post-parent 200-shape drift (W-A7) still needs the vendor-side fix\"\n },\n \"vendorEvidence\": [\n \"Expected OperationResultModel { itemId } (or { id }); got a different shape (ladder_decode.log, INVALID_RESPONSE)\",\n \"api-docs.json declares OperationResultModel for POST /V1.0/Tickets/{id}/TicketChecklistLibraries — the vendor deviates (W-A7 adjudication: vendor spec drift, not a node defect)\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Resource not found: <!DOCTYPE html PUBLIC .../xhtml/1.0/Strict ...>\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for ticket_checklist_libraries (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for ticket_checklist_libraries (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": null\n },\n \"ticket_history\": {\n \"resource\": \"ticket_history\",\n \"apiEntity\": \"TicketHistory\",\n \"kind\": \"entity\",\n \"path\": \"TicketHistory\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_note_attachments\": {\n \"resource\": \"ticket_note_attachments\",\n \"apiEntity\": \"TicketNoteAttachment\",\n \"kind\": \"entity\",\n \"path\": \"TicketNoteAttachments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"ticket_notes\",\n \"segment\": \"Attachments\",\n \"field\": \"ticketNoteID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_note_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_note_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"52976761-8459-49af-8509-49e562e59dbb\\\",\\\"message\\\":\\\"Field 'Type': Missing Requir\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_note_webhooks\": {\n \"resource\": \"ticket_note_webhooks\",\n \"apiEntity\": \"TicketNoteWebhook\",\n \"kind\": \"entity\",\n \"path\": \"TicketNoteWebhooks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"ticket_notes\",\n \"segment\": \"Webhook\",\n \"field\": null\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_note_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_note_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_notes\": {\n \"resource\": \"ticket_notes\",\n \"apiEntity\": \"TicketNote\",\n \"kind\": \"entity\",\n \"path\": \"TicketNotes\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"Notes\",\n \"field\": \"ticketID\"\n },\n \"children\": [\n {\n \"resource\": \"ticket_note_attachments\",\n \"apiEntity\": \"TicketNoteAttachment\",\n \"parentField\": \"ticketNoteID\",\n \"parentSegment\": \"Attachments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"download\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_note_webhooks\",\n \"apiEntity\": \"TicketNoteWebhook\",\n \"parentField\": null,\n \"parentSegment\": \"Webhook\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"description\",\n \"noteType\",\n \"publish\"\n ],\n \"quirks\": [\n \"publish is an integer picklist (1/2/4), NOT a boolean — a JSON boolean 500s at the vendor parse layer\",\n \"noteType is an integer picklist\",\n \"ticketID is NOT in the body (the scoped parent path supplies it); title is optional\"\n ],\n \"createGuidance\": {\n \"createOp\": \"ticket_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"description\",\n \"noteType\",\n \"publish\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_notes.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for ticket_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for ticket_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"ticket_secondary_resources\": {\n \"resource\": \"ticket_secondary_resources\",\n \"apiEntity\": \"TicketSecondaryResource\",\n \"kind\": \"entity\",\n \"path\": \"TicketSecondaryResources\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"SecondaryResources\",\n \"field\": \"ticketID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_secondary_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_secondary_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"0965b007-8bd2-4d51-9967-257ab506a87a\\\",\\\"message\\\":\\\"Value does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"ticket_webhooks\": {\n \"resource\": \"ticket_webhooks\",\n \"apiEntity\": \"TicketWebhook\",\n \"kind\": \"entity\",\n \"path\": \"TicketWebhooks\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"A\",\n \"parent\": {\n \"resource\": \"tickets\",\n \"segment\": \"Webhook\",\n \"field\": null\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"name only (contains)\",\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"ticket_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"tickets\": {\n \"resource\": \"tickets\",\n \"apiEntity\": \"Ticket\",\n \"kind\": \"entity\",\n \"path\": \"Tickets\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": true,\n \"group\": \"A\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"ticket_additional_configuration_items\",\n \"apiEntity\": \"TicketAdditionalConfigurationItem\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"AdditionalConfigurationItems\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_additional_contacts\",\n \"apiEntity\": \"TicketAdditionalContact\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"AdditionalContacts\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_attachments\",\n \"apiEntity\": \"TicketAttachment\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"Attachments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"download\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_change_request_approvals\",\n \"apiEntity\": \"TicketChangeRequestApproval\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"ChangeRequestApprovals\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_charges\",\n \"apiEntity\": \"TicketCharge\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"Charges\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"createIfNotExists\"\n ],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_checklist_items\",\n \"apiEntity\": \"TicketChecklistItem\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"ChecklistItems\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_checklist_libraries\",\n \"apiEntity\": \"TicketChecklistLibrary\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"ChecklistLibraries\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": false,\n \"update\": false,\n \"delete\": false\n }\n },\n {\n \"resource\": \"ticket_notes\",\n \"apiEntity\": \"TicketNote\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"Notes\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": false\n }\n },\n {\n \"resource\": \"ticket_secondary_resources\",\n \"apiEntity\": \"TicketSecondaryResource\",\n \"parentField\": \"ticketID\",\n \"parentSegment\": \"SecondaryResources\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n },\n {\n \"resource\": \"ticket_webhooks\",\n \"apiEntity\": \"TicketWebhook\",\n \"parentField\": null,\n \"parentSegment\": \"Webhook\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [],\n \"searchCovers\": \"name only (contains)\",\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": true,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": true,\n \"searchCovers\": \"title only (contains); ticketNumber lookups use resolve / findByTicketNumber\",\n \"findBy\": [\n \"findByTicketNumber\"\n ]\n },\n \"blindSurfaces\": {\n \"count\": {\n \"kind\": \"unfiltered-blind\",\n \"note\": \"the UNFILTERED tickets count/query surface is blind in ww29 (live-verified: 0 before AND after a proven live create). FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a TRUE absence, never a sentinel. An unfiltered 0/empty result proves nothing — get(id) is the authority.\"\n },\n \"query\": {\n \"kind\": \"unfiltered-blind\",\n \"note\": \"the UNFILTERED tickets count/query surface is blind in ww29 (live-verified: 0 before AND after a proven live create). FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a TRUE absence, never a sentinel. An unfiltered 0/empty result proves nothing — get(id) is the authority.\"\n }\n },\n \"zoneFacts\": {\n \"createRequiredSet\": [\n \"title\",\n \"status\",\n \"priority\",\n \"companyID\",\n \"queueID\"\n ],\n \"quirks\": [\n \"UNFILTERED count/query are blind in this zone (0 before AND after a proven live create); FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a true absence; get(id) is the authority\",\n \"status is a tenant-specific integer picklist (31 values on ww29, max id 43 — the labels via operations.fieldCatalog (labels: true))\",\n \"queueID is required on create: a create missing it 500s with a typed field-level error\"\n ],\n \"createGuidance\": {\n \"createOp\": \"tickets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"title\",\n \"status\",\n \"priority\",\n \"companyID\",\n \"queueID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 tickets); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"tickets.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"tickets.delete\\\\\\\" — it is not in the capability registr\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for tickets (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": {\n \"note\": \"the vendor defines no DELETE for tickets (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"proof\": \"spec-derived\"\n },\n \"markerField\": \"title\"\n },\n \"time_entries\": {\n \"resource\": \"time_entries\",\n \"apiEntity\": \"TimeEntry\",\n \"kind\": \"entity\",\n \"path\": \"TimeEntries\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [\n {\n \"resource\": \"time_entry_attachments\",\n \"apiEntity\": \"TimeEntryAttachment\",\n \"parentField\": \"timeEntryID\",\n \"parentSegment\": \"Attachments\",\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"specialOps\": [\n \"download\"\n ],\n \"searchCovers\": null,\n \"scopedOps\": {\n \"create\": true,\n \"query\": true,\n \"update\": false,\n \"delete\": true\n }\n }\n ],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"quirks\": [\n \"createForResource node rule: the allocation code is ALWAYS resolved from billing_codes with the family + active filter (the unfiltered surface is blind); the internal linkage body posts the model name internalBillingCodeID (the S9b live wire oracle)\",\n \"the vendor double-validates roleID (an active general allocation code AND a Role reference); in ww29 the two sets are disjoint, so the task/ticket linkage falls back to the internal linkage\"\n ],\n \"createGuidance\": {\n \"createOp\": \"time_entries.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"resource-role-pair\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382, 3 live attempts with own resource 31131505 + roles 29685291/29682834/29683323): current vendor text 'API-only user cannot be selected for this field' (10-04: 'The specified AssignedResourceID and AssignedRoleID combination is not currently defined'). UNSATISFIABLE for this API-only user (resources table blind; own API-only resource refused by the vendor). createForResource (stage-11 proven) is walled by the same drift. Valid in-tenant pairs observed via postedWithin: (31131373, 29682834), (29869529, 29682834) — human resources the API user cannot select.\",\n \"remedy\": \"vendor eligibility, not missing tenant data: an API-only user can never be the selectable resource. Use a non-API-only (human) API user or record time entries in the Autotask UI; the working reads remain postedWithin / the window helpers (W-D3 pointer note)\"\n },\n \"vendorEvidence\": [\n \"The specified AssignedResourceID and AssignedRoleID combination is not currently defined.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"time_entries.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c5ff4e59-bc8f-4f88-ad05-6445d8fddfa6\\\",\\\"message\\\":\\\"API-only user cannot be selected for th\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"API-only user cannot be selected for this field.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"time_entry_attachments\": {\n \"resource\": \"time_entry_attachments\",\n \"apiEntity\": \"TimeEntryAttachment\",\n \"kind\": \"entity\",\n \"path\": \"TimeEntryAttachments\",\n \"parentScoped\": true,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": {\n \"resource\": \"time_entries\",\n \"segment\": \"Attachments\",\n \"field\": \"timeEntryID\"\n },\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"time_entry_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"time_entry_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"04f16a9b-daa6-4dc1-96a2-32508985ac71\\\",\\\"message\\\":\\\"Field 'Type': Missing Require\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Picklist value [0] does not exist for Publish. / Field 'Type': Missing Required Field: Type.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"time_off_requests\": {\n \"resource\": \"time_off_requests\",\n \"apiEntity\": \"TimeOffRequest\",\n \"kind\": \"entity\",\n \"path\": \"TimeOffRequests\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"inventory_products\": {\n \"resource\": \"inventory_products\",\n \"apiEntity\": \"InventoryProduct\",\n \"kind\": \"entity\",\n \"path\": \"InventoryProducts\",\n \"parentScoped\": false,\n \"tier\": \"extended\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": {\n \"createGuidance\": {\n \"createOp\": \"inventory_products.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"productID\",\n \"quantityMaximum\",\n \"inventoryLocationID\",\n \"quantityMinimum\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the productID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the productID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"productID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"inventory_products.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d27710fa-5cb6-455a-bc60-99c6efe2b810\\\",\\\"message\\\":\\\"Field 'quantityMinimum': Missing \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n },\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"authenticate\": {\n \"resource\": \"authenticate\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/Authenticate\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"version\": {\n \"resource\": \"version\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/Version\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"version_information\": {\n \"resource\": \"version_information\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"VersionInformation\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"entity_information\": {\n \"resource\": \"entity_information\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/EntityInformation\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"modules\": {\n \"resource\": \"modules\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/Modules\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"threshold_information\": {\n \"resource\": \"threshold_information\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/ThresholdInformation\",\n \"parentScoped\": false,\n \"tier\": \"core\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n },\n \"zone_information\": {\n \"resource\": \"zone_information\",\n \"apiEntity\": null,\n \"kind\": \"integration\",\n \"path\": \"V1.0/ZoneInformation\",\n \"parentScoped\": false,\n \"tier\": \"advanced\",\n \"workflowResource\": false,\n \"group\": \"B\",\n \"parent\": null,\n \"children\": [],\n \"naturalKeys\": {\n \"hasSearch\": false,\n \"searchCovers\": null,\n \"findBy\": []\n },\n \"blindSurfaces\": null,\n \"zoneFacts\": null,\n \"deleteBoundary\": null,\n \"markerField\": null\n }\n};\n\n/** The runtime stamps keyed by resource → op (the base.ts sentinel lookup). */\nexport const BLIND_SURFACE_STAMPS: Record<string, Record<string, BlindSurfaceInfo | undefined>> = {\n \"companies\": {\n \"count\": {\n \"surface\": \"companies.count\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unowned-blind\",\n \"authority\": \"companies.get\",\n \"note\": \"companies count/query return 0/empty for companies not owned by the caller (ww29, live-verified: 0 before AND after a proven live create). A 0/empty result on this surface proves nothing — get(id) is the authority: it returns the record even while count/query are blind.\"\n },\n \"query\": {\n \"surface\": \"companies.query\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unowned-blind\",\n \"authority\": \"companies.get\",\n \"note\": \"companies count/query return 0/empty for companies not owned by the caller (ww29, live-verified: 0 before AND after a proven live create). A 0/empty result on this surface proves nothing — get(id) is the authority: it returns the record even while count/query are blind.\"\n }\n },\n \"tickets\": {\n \"count\": {\n \"surface\": \"tickets.count\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unfiltered-blind\",\n \"authority\": \"tickets.get\",\n \"note\": \"the UNFILTERED tickets count/query surface is blind in ww29 (live-verified: 0 before AND after a proven live create). FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a TRUE absence, never a sentinel. An unfiltered 0/empty result proves nothing — get(id) is the authority.\"\n },\n \"query\": {\n \"surface\": \"tickets.query\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unfiltered-blind\",\n \"authority\": \"tickets.get\",\n \"note\": \"the UNFILTERED tickets count/query surface is blind in ww29 (live-verified: 0 before AND after a proven live create). FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a TRUE absence, never a sentinel. An unfiltered 0/empty result proves nothing — get(id) is the authority.\"\n }\n },\n \"billing_codes\": {\n \"count\": {\n \"surface\": \"billing_codes.count\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unfiltered-blind\",\n \"authority\": \"billing_codes.get\",\n \"note\": \"the UNFILTERED billing_codes count/query surface is blind in ww29 (live-verified). Query with `useType` (1 = general, 3 = internal) + `isActive` filters — filtered queries return real data; time_entries.createForResource always applies them for you. get(id) is the authority.\"\n },\n \"query\": {\n \"surface\": \"billing_codes.query\",\n \"zone\": \"australia-nz\",\n \"kind\": \"unfiltered-blind\",\n \"authority\": \"billing_codes.get\",\n \"note\": \"the UNFILTERED billing_codes count/query surface is blind in ww29 (live-verified). Query with `useType` (1 = general, 3 = internal) + `isActive` filters — filtered queries return real data; time_entries.createForResource always applies them for you. get(id) is the authority.\"\n }\n }\n};\n\n/**\n * The spec-derived delete boundary over the stampable create ops (issue #9):\n * resource → the deterministic boundary note (the create dry-run warning +\n * the recovery op's delete.available=false refusal text). Absent resource =\n * the vendor defines a DELETE (boundary available). Zero wire by construction.\n */\nexport const DELETE_BOUNDARY_NOTES: Record<string, string> = {\n \"companies\": \"the vendor defines no DELETE for companies (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"company_notes\": \"the vendor defines no DELETE for company_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"configuration_item_categories\": \"the vendor defines no DELETE for configuration_item_categories (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"configuration_item_notes\": \"the vendor defines no DELETE for configuration_item_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"configuration_items\": \"the vendor defines no DELETE for configuration_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_block_hour_factors\": \"the vendor defines no DELETE for contract_block_hour_factors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_blocks\": \"the vendor defines no DELETE for contract_blocks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_milestones\": \"the vendor defines no DELETE for contract_milestones (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_notes\": \"the vendor defines no DELETE for contract_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_rates\": \"the vendor defines no DELETE for contract_rates (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_retainers\": \"the vendor defines no DELETE for contract_retainers (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_role_costs\": \"the vendor defines no DELETE for contract_role_costs (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_service_adjustments\": \"the vendor defines no DELETE for contract_service_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_service_bundle_adjustments\": \"the vendor defines no DELETE for contract_service_bundle_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_service_bundles\": \"the vendor defines no DELETE for contract_service_bundles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_services\": \"the vendor defines no DELETE for contract_services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contract_ticket_purchases\": \"the vendor defines no DELETE for contract_ticket_purchases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"contracts\": \"the vendor defines no DELETE for contracts (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"departments\": \"the vendor defines no DELETE for departments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"domain_registrars\": \"the vendor defines no DELETE for domain_registrars (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"expense_items\": \"the vendor defines no DELETE for expense_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"expense_reports\": \"the vendor defines no DELETE for expense_reports (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"opportunities\": \"the vendor defines no DELETE for opportunities (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"phases\": \"the vendor defines no DELETE for phases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"product_vendors\": \"the vendor defines no DELETE for product_vendors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"products\": \"the vendor defines no DELETE for products (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"project_notes\": \"the vendor defines no DELETE for project_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"projects\": \"the vendor defines no DELETE for projects (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"purchase_order_item_receiving\": \"the vendor defines no DELETE for purchase_order_item_receiving (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"purchase_order_items\": \"the vendor defines no DELETE for purchase_order_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"purchase_orders\": \"the vendor defines no DELETE for purchase_orders (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"quote_locations\": \"the vendor defines no DELETE for quote_locations (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"quotes\": \"the vendor defines no DELETE for quotes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"resource_role_queues\": \"the vendor defines no DELETE for resource_role_queues (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"roles\": \"the vendor defines no DELETE for roles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"services\": \"the vendor defines no DELETE for services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"tasks\": \"the vendor defines no DELETE for tasks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"ticket_checklist_libraries\": \"the vendor defines no DELETE for ticket_checklist_libraries (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"ticket_notes\": \"the vendor defines no DELETE for ticket_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\",\n \"tickets\": \"the vendor defines no DELETE for tickets (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n};\n\n/** The spec-derived name-like field per resource (issue #9): the recovery\n * marker query's default filter field. Absent resource = the model has no\n * name-like field (the recovery input's field is then required). */\nexport const MARKER_FIELDS: Record<string, string> = {\n \"companies\": \"companyName\",\n \"company_notes\": \"name\",\n \"configuration_item_categories\": \"name\",\n \"configuration_item_notes\": \"title\",\n \"configuration_items\": \"referenceTitle\",\n \"contract_milestones\": \"title\",\n \"contract_notes\": \"title\",\n \"contracts\": \"contractName\",\n \"departments\": \"name\",\n \"domain_registrars\": \"name\",\n \"expense_reports\": \"name\",\n \"opportunities\": \"title\",\n \"products\": \"name\",\n \"project_notes\": \"title\",\n \"phases\": \"title\",\n \"tasks\": \"title\",\n \"projects\": \"projectName\",\n \"quotes\": \"name\",\n \"roles\": \"name\",\n \"services\": \"name\",\n \"ticket_notes\": \"title\",\n \"tickets\": \"title\"\n};\n\n/** One response-shape-drift marker pin (issue #13 — the create-path recovery config). */\nexport interface ResponseDriftMarkerInfo {\n /** The pinned marker field on the resource's LIVE entity (the gate checks spec membership for spec-derived pins; the live proofs cite the evidence). */\n markerField: string;\n /** The proof level (closed set): live-verified | discovery-sweep | spec-derived. */\n proof: 'live-verified' | 'discovery-sweep' | 'spec-derived';\n /** The drift statement + the marker basis, LLM-consumer grade. */\n note: string;\n /** The live evidence (non-null for the non-spec-derived proofs — the vendored model may omit the field the live entity carries). */\n evidence: string | null;\n}\n\n/**\n * The response-shape-drift marker pins keyed by resource (issue #13): the\n * create path reads this on a drifted 2xx (the envelope check failed) and\n * runs ONE bounded marker read (limit 5, the resource's own query surface).\n * Absent resource = no pin = the pre-recovery behaviour (the typed error\n * stands, zero extra requests). Zero wire by construction (served plan data).\n */\nexport const RESPONSE_DRIFT_MARKERS: Record<string, ResponseDriftMarkerInfo> = {\n \"ticket_checklist_libraries\": {\n \"markerField\": \"name\",\n \"proof\": \"live-verified\",\n \"note\": \"ticket_checklist_libraries.create answers HTTP 200 with a body that is NOT the specced OperationResultModel (wall W-A7, stage 11, 2026-10-04 — the vendor deviates from its own spec; the node types INVALID_RESPONSE, correct-by-spec). The created record carries the caller-supplied marker in `name` (the stage-11 create posted name=<marker> and the vendor accepted it — residue records under ticket 527119, name=marker). The vendored TicketChecklistLibraryModel omits `name` (a vendor spec gap — the live entity carries it), so the pin is live-verified rather than spec-derived. The create-path recovery runs ONE bounded marker read (limit 5) on a drifted 200 and stamps the recovered id idFrom: \\\"marker-recovery\\\"; it is opt-out (recoverIdFromMarker: false) and never silent. Re-verified 2026-10-06 (confirm-100): the call now reaches an HTML 404 (\\\"Resource not found\\\", typed NOT_FOUND) — the checklist-library parent (checklistLibraryID) is blind/absent for this API user BEFORE the 10-04 200-shape drift surfaces; the drift pin remains for the post-parent shape.\",\n \"evidence\": \"stage-11 apply-matrix (2026-10-04, marker FULL100W-1791110339): POST /V1.0/Tickets/527119/ChecklistLibraries with body { name: \\\"<marker>-item\\\" } answered HTTP 200 (the vendor accepted the name field) with a body that is not OperationResultModel -> the SDK typed INVALID_RESPONSE (receipts-iter3); 1-2 residue records under ticket 527119 with name=<marker> (walls.json W-A7).\"\n }\n};\n\n/**\n * The typed empty-reason stamps keyed by resource → op (issue #14): the\n * result-time reason the base.ts wrap attaches to 0/empty count/query\n * results and the error-path details src/http.ts attaches to typed errors.\n * The 'blind-surface' kind is absent by design — base.ts synthesizes it\n * from BLIND_SURFACE_STAMPS (the pin's byte-identical note). Additive only\n * — count/items/status/error-code values are never mutated.\n */\nexport const EMPTY_REASON_STAMPS: Record<string, Record<string, EmptyReasonInfo | undefined>> = {\n \"appointments\": {\n \"count\": {\n \"surface\": \"appointments.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's appointments table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"appointments.get\",\n \"remedy\": \"address a record by a known id (appointments.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"appointments.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's appointments table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"appointments.get\",\n \"remedy\": \"address a record by a known id (appointments.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"appointments.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no appointments rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a appointments update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"appointments.get\",\n \"remedy\": \"address a record by a known id (appointments.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"billing_items\": {\n \"count\": {\n \"surface\": \"billing_items.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's billing_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"billing_items.get\",\n \"remedy\": \"address a record by a known id (billing_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"billing_items.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's billing_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"billing_items.get\",\n \"remedy\": \"address a record by a known id (billing_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"billing_items.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no billing_items rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a billing_items update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"billing_items.get\",\n \"remedy\": \"address a record by a known id (billing_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"change_request_links\": {\n \"count\": {\n \"surface\": \"change_request_links.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's change_request_links table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"change_request_links.get\",\n \"remedy\": \"address a record by a known id (change_request_links.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"change_request_links.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's change_request_links table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"change_request_links.get\",\n \"remedy\": \"address a record by a known id (change_request_links.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"classification_icons\": {\n \"count\": {\n \"surface\": \"classification_icons.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's classification_icons table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"classification_icons.get\",\n \"remedy\": \"address a record by a known id (classification_icons.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"classification_icons.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's classification_icons table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"classification_icons.get\",\n \"remedy\": \"address a record by a known id (classification_icons.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"company_alerts\": {\n \"count\": {\n \"surface\": \"company_alerts.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_alerts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_alerts.get\",\n \"remedy\": \"address a record by a known id (company_alerts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"company_alerts.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_alerts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_alerts.get\",\n \"remedy\": \"address a record by a known id (company_alerts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"company_alerts.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the company_alerts table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a company_alerts update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"company_alerts.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (company_alerts.get(parentId, id) misses by construction)\"\n }\n },\n \"company_notes\": {\n \"count\": {\n \"surface\": \"company_notes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_notes.get\",\n \"remedy\": \"address a record by a known id (company_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"company_notes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_notes.get\",\n \"remedy\": \"address a record by a known id (company_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"company_notes.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the company_notes table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a company_notes update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"company_notes.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (company_notes.get(parentId, id) misses by construction)\"\n }\n },\n \"company_site_configurations\": {\n \"count\": {\n \"surface\": \"company_site_configurations.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_site_configurations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_site_configurations.get\",\n \"remedy\": \"address a record by a known id (company_site_configurations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"company_site_configurations.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_site_configurations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_site_configurations.get\",\n \"remedy\": \"address a record by a known id (company_site_configurations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"company_site_configurations.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the company_site_configurations table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a company_site_configurations update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"company_site_configurations.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (company_site_configurations.get(parentId, id) misses by construction)\"\n }\n },\n \"company_webhooks\": {\n \"count\": {\n \"surface\": \"company_webhooks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_webhooks.get\",\n \"remedy\": \"address a record by a known id (company_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"company_webhooks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's company_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"company_webhooks.get\",\n \"remedy\": \"address a record by a known id (company_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"company_webhooks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the company_webhooks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a company_webhooks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"company_webhooks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (company_webhooks.get(parentId, id) misses by construction)\"\n }\n },\n \"configuration_item_billing_product_associations\": {\n \"count\": {\n \"surface\": \"configuration_item_billing_product_associations.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_billing_product_associations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_billing_product_associations.get\",\n \"remedy\": \"address a record by a known id (configuration_item_billing_product_associations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"configuration_item_billing_product_associations.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_billing_product_associations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_billing_product_associations.get\",\n \"remedy\": \"address a record by a known id (configuration_item_billing_product_associations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"configuration_item_billing_product_associations.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the configuration_item_billing_product_associations table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a configuration_item_billing_product_associations update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"configuration_item_billing_product_associations.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (configuration_item_billing_product_associations.get(parentId, id) misses by construction)\"\n }\n },\n \"configuration_item_types\": {\n \"count\": {\n \"surface\": \"configuration_item_types.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_types table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_types.get\",\n \"remedy\": \"address a record by a known id (configuration_item_types.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"configuration_item_types.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_types table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_types.get\",\n \"remedy\": \"address a record by a known id (configuration_item_types.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"configuration_item_types.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no configuration_item_types rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a configuration_item_types update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"configuration_item_types.get\",\n \"remedy\": \"address a record by a known id (configuration_item_types.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"configuration_item_webhooks\": {\n \"count\": {\n \"surface\": \"configuration_item_webhooks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_webhooks.get\",\n \"remedy\": \"address a record by a known id (configuration_item_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"configuration_item_webhooks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_item_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_item_webhooks.get\",\n \"remedy\": \"address a record by a known id (configuration_item_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"configuration_item_webhooks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the configuration_item_webhooks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a configuration_item_webhooks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"configuration_item_webhooks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (configuration_item_webhooks.get(parentId, id) misses by construction)\"\n }\n },\n \"configuration_items\": {\n \"count\": {\n \"surface\": \"configuration_items.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_items.get\",\n \"remedy\": \"address a record by a known id (configuration_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"configuration_items.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's configuration_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"configuration_items.get\",\n \"remedy\": \"address a record by a known id (configuration_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"configuration_items.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no configuration_items rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a configuration_items update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"configuration_items.get\",\n \"remedy\": \"address a record by a known id (configuration_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"contact_webhooks\": {\n \"count\": {\n \"surface\": \"contact_webhooks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contact_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contact_webhooks.get\",\n \"remedy\": \"address a record by a known id (contact_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contact_webhooks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contact_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contact_webhooks.get\",\n \"remedy\": \"address a record by a known id (contact_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contact_webhooks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contact_webhooks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contact_webhooks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contact_webhooks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contact_webhooks.get(parentId, id) misses by construction)\"\n }\n },\n \"contacts\": {\n \"count\": {\n \"surface\": \"contacts.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contacts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contacts.get\",\n \"remedy\": \"address a record by a known id (contacts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contacts.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contacts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contacts.get\",\n \"remedy\": \"address a record by a known id (contacts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contacts.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contacts table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contacts update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contacts.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contacts.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_billing_rules\": {\n \"count\": {\n \"surface\": \"contract_billing_rules.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_billing_rules table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_billing_rules.get\",\n \"remedy\": \"address a record by a known id (contract_billing_rules.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_billing_rules.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_billing_rules table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_billing_rules.get\",\n \"remedy\": \"address a record by a known id (contract_billing_rules.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_billing_rules.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_billing_rules table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_billing_rules update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_billing_rules.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_billing_rules.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_block_hour_factors\": {\n \"count\": {\n \"surface\": \"contract_block_hour_factors.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_block_hour_factors table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_block_hour_factors.get\",\n \"remedy\": \"address a record by a known id (contract_block_hour_factors.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_block_hour_factors.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_block_hour_factors table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_block_hour_factors.get\",\n \"remedy\": \"address a record by a known id (contract_block_hour_factors.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_block_hour_factors.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_block_hour_factors table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_block_hour_factors update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_block_hour_factors.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_block_hour_factors.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_blocks\": {\n \"count\": {\n \"surface\": \"contract_blocks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_blocks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_blocks.get\",\n \"remedy\": \"address a record by a known id (contract_blocks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_blocks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_blocks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_blocks.get\",\n \"remedy\": \"address a record by a known id (contract_blocks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_blocks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_blocks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_blocks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_blocks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_blocks.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_charges\": {\n \"count\": {\n \"surface\": \"contract_charges.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_charges.get\",\n \"remedy\": \"address a record by a known id (contract_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_charges.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_charges.get\",\n \"remedy\": \"address a record by a known id (contract_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_charges.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_charges table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_charges update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_charges.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_charges.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_exclusion_billing_codes\": {\n \"count\": {\n \"surface\": \"contract_exclusion_billing_codes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_exclusion_billing_codes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_exclusion_billing_codes.get\",\n \"remedy\": \"address a record by a known id (contract_exclusion_billing_codes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_exclusion_billing_codes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_exclusion_billing_codes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_exclusion_billing_codes.get\",\n \"remedy\": \"address a record by a known id (contract_exclusion_billing_codes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"contract_exclusion_roles\": {\n \"count\": {\n \"surface\": \"contract_exclusion_roles.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_exclusion_roles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_exclusion_roles.get\",\n \"remedy\": \"address a record by a known id (contract_exclusion_roles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_exclusion_roles.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_exclusion_roles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_exclusion_roles.get\",\n \"remedy\": \"address a record by a known id (contract_exclusion_roles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"contract_milestones\": {\n \"count\": {\n \"surface\": \"contract_milestones.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_milestones table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_milestones.get\",\n \"remedy\": \"address a record by a known id (contract_milestones.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_milestones.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_milestones table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_milestones.get\",\n \"remedy\": \"address a record by a known id (contract_milestones.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_milestones.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_milestones table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_milestones update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_milestones.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_milestones.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_notes\": {\n \"count\": {\n \"surface\": \"contract_notes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_notes.get\",\n \"remedy\": \"address a record by a known id (contract_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_notes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_notes.get\",\n \"remedy\": \"address a record by a known id (contract_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_notes.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_notes table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_notes update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_notes.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_notes.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_rates\": {\n \"count\": {\n \"surface\": \"contract_rates.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_rates table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_rates.get\",\n \"remedy\": \"address a record by a known id (contract_rates.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_rates.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_rates table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_rates.get\",\n \"remedy\": \"address a record by a known id (contract_rates.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_rates.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_rates table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_rates update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_rates.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_rates.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_retainers\": {\n \"count\": {\n \"surface\": \"contract_retainers.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_retainers table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_retainers.get\",\n \"remedy\": \"address a record by a known id (contract_retainers.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_retainers.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_retainers table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_retainers.get\",\n \"remedy\": \"address a record by a known id (contract_retainers.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_retainers.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_retainers table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_retainers update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_retainers.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_retainers.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_role_costs\": {\n \"count\": {\n \"surface\": \"contract_role_costs.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_role_costs table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_role_costs.get\",\n \"remedy\": \"address a record by a known id (contract_role_costs.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_role_costs.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_role_costs table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_role_costs.get\",\n \"remedy\": \"address a record by a known id (contract_role_costs.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_role_costs.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_role_costs table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_role_costs update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_role_costs.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_role_costs.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_service_bundle_units\": {\n \"count\": {\n \"surface\": \"contract_service_bundle_units.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_bundle_units table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_bundle_units.get\",\n \"remedy\": \"address a record by a known id (contract_service_bundle_units.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_service_bundle_units.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_bundle_units table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_bundle_units.get\",\n \"remedy\": \"address a record by a known id (contract_service_bundle_units.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"contract_service_bundles\": {\n \"count\": {\n \"surface\": \"contract_service_bundles.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_bundles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_bundles.get\",\n \"remedy\": \"address a record by a known id (contract_service_bundles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_service_bundles.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_bundles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_bundles.get\",\n \"remedy\": \"address a record by a known id (contract_service_bundles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_service_bundles.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_service_bundles table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_service_bundles update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_service_bundles.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_service_bundles.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_service_units\": {\n \"count\": {\n \"surface\": \"contract_service_units.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_units table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_units.get\",\n \"remedy\": \"address a record by a known id (contract_service_units.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_service_units.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_service_units table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_service_units.get\",\n \"remedy\": \"address a record by a known id (contract_service_units.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"contract_services\": {\n \"count\": {\n \"surface\": \"contract_services.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_services table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_services.get\",\n \"remedy\": \"address a record by a known id (contract_services.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_services.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_services table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_services.get\",\n \"remedy\": \"address a record by a known id (contract_services.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_services.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_services table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_services update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_services.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_services.get(parentId, id) misses by construction)\"\n }\n },\n \"contract_ticket_purchases\": {\n \"count\": {\n \"surface\": \"contract_ticket_purchases.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_ticket_purchases table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_ticket_purchases.get\",\n \"remedy\": \"address a record by a known id (contract_ticket_purchases.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contract_ticket_purchases.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contract_ticket_purchases table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contract_ticket_purchases.get\",\n \"remedy\": \"address a record by a known id (contract_ticket_purchases.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contract_ticket_purchases.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the contract_ticket_purchases table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a contract_ticket_purchases update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"contract_ticket_purchases.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (contract_ticket_purchases.get(parentId, id) misses by construction)\"\n }\n },\n \"contracts\": {\n \"count\": {\n \"surface\": \"contracts.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contracts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contracts.get\",\n \"remedy\": \"address a record by a known id (contracts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"contracts.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's contracts table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"contracts.get\",\n \"remedy\": \"address a record by a known id (contracts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"contracts.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no contracts rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a contracts update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"contracts.get\",\n \"remedy\": \"address a record by a known id (contracts.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"countries\": {\n \"count\": {\n \"surface\": \"countries.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's countries table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"countries.get\",\n \"remedy\": \"address a record by a known id (countries.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"countries.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's countries table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"countries.get\",\n \"remedy\": \"address a record by a known id (countries.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"countries.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no countries rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a countries update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"countries.get\",\n \"remedy\": \"address a record by a known id (countries.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"expense_items\": {\n \"count\": {\n \"surface\": \"expense_items.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's expense_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"expense_items.get\",\n \"remedy\": \"address a record by a known id (expense_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"expense_items.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's expense_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"expense_items.get\",\n \"remedy\": \"address a record by a known id (expense_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"expense_items.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the expense_items table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a expense_items update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"expense_items.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (expense_items.get(parentId, id) misses by construction)\"\n }\n },\n \"expense_reports\": {\n \"count\": {\n \"surface\": \"expense_reports.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's expense_reports table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"expense_reports.get\",\n \"remedy\": \"address a record by a known id (expense_reports.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"expense_reports.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's expense_reports table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"expense_reports.get\",\n \"remedy\": \"address a record by a known id (expense_reports.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"expense_reports.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no expense_reports rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a expense_reports update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"expense_reports.get\",\n \"remedy\": \"address a record by a known id (expense_reports.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"invoices\": {\n \"count\": {\n \"surface\": \"invoices.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's invoices table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"invoices.get\",\n \"remedy\": \"address a record by a known id (invoices.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"invoices.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's invoices table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"invoices.get\",\n \"remedy\": \"address a record by a known id (invoices.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"invoices.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no invoices rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a invoices update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"invoices.get\",\n \"remedy\": \"address a record by a known id (invoices.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"notification_history\": {\n \"count\": {\n \"surface\": \"notification_history.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's notification_history table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"notification_history.get\",\n \"remedy\": \"address a record by a known id (notification_history.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"notification_history.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's notification_history table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"notification_history.get\",\n \"remedy\": \"address a record by a known id (notification_history.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"product_vendors\": {\n \"count\": {\n \"surface\": \"product_vendors.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's product_vendors table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"product_vendors.get\",\n \"remedy\": \"address a record by a known id (product_vendors.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"product_vendors.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's product_vendors table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"product_vendors.get\",\n \"remedy\": \"address a record by a known id (product_vendors.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"product_vendors.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the product_vendors table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a product_vendors update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"product_vendors.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (product_vendors.get(parentId, id) misses by construction)\"\n }\n },\n \"products\": {\n \"count\": {\n \"surface\": \"products.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's products table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"products.get\",\n \"remedy\": \"address a record by a known id (products.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"products.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's products table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"products.get\",\n \"remedy\": \"address a record by a known id (products.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"products.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no products rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a products update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"products.get\",\n \"remedy\": \"address a record by a known id (products.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"project_charges\": {\n \"count\": {\n \"surface\": \"project_charges.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's project_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"project_charges.get\",\n \"remedy\": \"address a record by a known id (project_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"project_charges.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's project_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"project_charges.get\",\n \"remedy\": \"address a record by a known id (project_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"project_charges.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the project_charges table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a project_charges update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"project_charges.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (project_charges.get(parentId, id) misses by construction)\"\n }\n },\n \"project_notes\": {\n \"count\": {\n \"surface\": \"project_notes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's project_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"project_notes.get\",\n \"remedy\": \"address a record by a known id (project_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"project_notes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's project_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"project_notes.get\",\n \"remedy\": \"address a record by a known id (project_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"project_notes.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the project_notes table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a project_notes update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"project_notes.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (project_notes.get(parentId, id) misses by construction)\"\n }\n },\n \"purchase_approvals\": {\n \"count\": {\n \"surface\": \"purchase_approvals.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_approvals table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_approvals.get\",\n \"remedy\": \"address a record by a known id (purchase_approvals.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"purchase_approvals.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_approvals table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_approvals.get\",\n \"remedy\": \"address a record by a known id (purchase_approvals.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"purchase_approvals.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no purchase_approvals rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a purchase_approvals update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"purchase_approvals.get\",\n \"remedy\": \"address a record by a known id (purchase_approvals.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"purchase_order_items\": {\n \"count\": {\n \"surface\": \"purchase_order_items.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_order_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_order_items.get\",\n \"remedy\": \"address a record by a known id (purchase_order_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"purchase_order_items.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_order_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_order_items.get\",\n \"remedy\": \"address a record by a known id (purchase_order_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"purchase_order_items.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the purchase_order_items table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a purchase_order_items update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"purchase_order_items.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (purchase_order_items.get(parentId, id) misses by construction)\"\n }\n },\n \"purchase_orders\": {\n \"count\": {\n \"surface\": \"purchase_orders.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_orders table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_orders.get\",\n \"remedy\": \"address a record by a known id (purchase_orders.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"purchase_orders.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's purchase_orders table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"purchase_orders.get\",\n \"remedy\": \"address a record by a known id (purchase_orders.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"purchase_orders.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no purchase_orders rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a purchase_orders update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"purchase_orders.get\",\n \"remedy\": \"address a record by a known id (purchase_orders.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"quote_items\": {\n \"count\": {\n \"surface\": \"quote_items.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_items.get\",\n \"remedy\": \"address a record by a known id (quote_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"quote_items.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_items table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_items.get\",\n \"remedy\": \"address a record by a known id (quote_items.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"quote_items.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the quote_items table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a quote_items update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"quote_items.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (quote_items.get(parentId, id) misses by construction)\"\n }\n },\n \"quote_locations\": {\n \"count\": {\n \"surface\": \"quote_locations.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_locations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_locations.get\",\n \"remedy\": \"address a record by a known id (quote_locations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"quote_locations.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_locations table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_locations.get\",\n \"remedy\": \"address a record by a known id (quote_locations.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"quote_locations.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the quote_locations table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a quote_locations update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"quote_locations.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (quote_locations.get(parentId, id) misses by construction)\"\n }\n },\n \"quote_templates\": {\n \"count\": {\n \"surface\": \"quote_templates.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_templates table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_templates.get\",\n \"remedy\": \"address a record by a known id (quote_templates.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"quote_templates.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quote_templates table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quote_templates.get\",\n \"remedy\": \"address a record by a known id (quote_templates.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"quotes\": {\n \"count\": {\n \"surface\": \"quotes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quotes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quotes.get\",\n \"remedy\": \"address a record by a known id (quotes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"quotes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's quotes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"quotes.get\",\n \"remedy\": \"address a record by a known id (quotes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"quotes.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no quotes rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a quotes update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"quotes.get\",\n \"remedy\": \"address a record by a known id (quotes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"resource_roles\": {\n \"count\": {\n \"surface\": \"resource_roles.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resource_roles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resource_roles.get\",\n \"remedy\": \"address a record by a known id (resource_roles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"resource_roles.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resource_roles table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resource_roles.get\",\n \"remedy\": \"address a record by a known id (resource_roles.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"resource_skills\": {\n \"count\": {\n \"surface\": \"resource_skills.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resource_skills table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resource_skills.get\",\n \"remedy\": \"address a record by a known id (resource_skills.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"resource_skills.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resource_skills table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resource_skills.get\",\n \"remedy\": \"address a record by a known id (resource_skills.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"resource_skills.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the resource_skills table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a resource_skills update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"resource_skills.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (resource_skills.get(parentId, id) misses by construction)\"\n }\n },\n \"resources\": {\n \"count\": {\n \"surface\": \"resources.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resources.get\",\n \"remedy\": \"address a record by a known id (resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"resources.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"resources.get\",\n \"remedy\": \"address a record by a known id (resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"resources.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no resources rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a resources update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"resources.get\",\n \"remedy\": \"address a record by a known id (resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"service_call_task_resources\": {\n \"count\": {\n \"surface\": \"service_call_task_resources.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_task_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_task_resources.get\",\n \"remedy\": \"address a record by a known id (service_call_task_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"service_call_task_resources.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_task_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_task_resources.get\",\n \"remedy\": \"address a record by a known id (service_call_task_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"service_call_tasks\": {\n \"count\": {\n \"surface\": \"service_call_tasks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_tasks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_tasks.get\",\n \"remedy\": \"address a record by a known id (service_call_tasks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"service_call_tasks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_tasks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_tasks.get\",\n \"remedy\": \"address a record by a known id (service_call_tasks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"service_call_ticket_resources\": {\n \"count\": {\n \"surface\": \"service_call_ticket_resources.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_ticket_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_ticket_resources.get\",\n \"remedy\": \"address a record by a known id (service_call_ticket_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"service_call_ticket_resources.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_ticket_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_ticket_resources.get\",\n \"remedy\": \"address a record by a known id (service_call_ticket_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"service_call_tickets\": {\n \"count\": {\n \"surface\": \"service_call_tickets.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_tickets table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_tickets.get\",\n \"remedy\": \"address a record by a known id (service_call_tickets.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"service_call_tickets.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_call_tickets table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_call_tickets.get\",\n \"remedy\": \"address a record by a known id (service_call_tickets.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"service_calls\": {\n \"count\": {\n \"surface\": \"service_calls.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_calls table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_calls.get\",\n \"remedy\": \"address a record by a known id (service_calls.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"service_calls.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's service_calls table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"service_calls.get\",\n \"remedy\": \"address a record by a known id (service_calls.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"service_calls.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no service_calls rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a service_calls update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"service_calls.get\",\n \"remedy\": \"address a record by a known id (service_calls.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"services\": {\n \"count\": {\n \"surface\": \"services.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's services table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"services.get\",\n \"remedy\": \"address a record by a known id (services.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"services.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's services table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"services.get\",\n \"remedy\": \"address a record by a known id (services.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"services.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no services rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a services update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"services.get\",\n \"remedy\": \"address a record by a known id (services.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"skills\": {\n \"count\": {\n \"surface\": \"skills.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's skills table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"skills.get\",\n \"remedy\": \"address a record by a known id (skills.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"skills.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's skills table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"skills.get\",\n \"remedy\": \"address a record by a known id (skills.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"subscription_periods\": {\n \"count\": {\n \"surface\": \"subscription_periods.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's subscription_periods table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"subscription_periods.get\",\n \"remedy\": \"address a record by a known id (subscription_periods.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"subscription_periods.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's subscription_periods table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"subscription_periods.get\",\n \"remedy\": \"address a record by a known id (subscription_periods.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"subscriptions\": {\n \"count\": {\n \"surface\": \"subscriptions.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's subscriptions table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"subscriptions.get\",\n \"remedy\": \"address a record by a known id (subscriptions.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"subscriptions.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's subscriptions table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"subscriptions.get\",\n \"remedy\": \"address a record by a known id (subscriptions.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"subscriptions.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds no subscriptions rows for this API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — a subscriptions update target miss here is INCONCLUSIVE (empty-for-user, not a defect)\",\n \"authority\": \"subscriptions.get\",\n \"remedy\": \"address a record by a known id (subscriptions.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"ticket_change_request_approvals\": {\n \"count\": {\n \"surface\": \"ticket_change_request_approvals.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_change_request_approvals table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_change_request_approvals.get\",\n \"remedy\": \"address a record by a known id (ticket_change_request_approvals.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_change_request_approvals.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_change_request_approvals table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_change_request_approvals.get\",\n \"remedy\": \"address a record by a known id (ticket_change_request_approvals.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"ticket_charges\": {\n \"count\": {\n \"surface\": \"ticket_charges.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_charges.get\",\n \"remedy\": \"address a record by a known id (ticket_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_charges.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_charges table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_charges.get\",\n \"remedy\": \"address a record by a known id (ticket_charges.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"ticket_charges.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the ticket_charges table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a ticket_charges update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"ticket_charges.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (ticket_charges.get(parentId, id) misses by construction)\"\n }\n },\n \"ticket_note_webhooks\": {\n \"count\": {\n \"surface\": \"ticket_note_webhooks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_note_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_note_webhooks.get\",\n \"remedy\": \"address a record by a known id (ticket_note_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_note_webhooks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_note_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_note_webhooks.get\",\n \"remedy\": \"address a record by a known id (ticket_note_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"ticket_note_webhooks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the ticket_note_webhooks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a ticket_note_webhooks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"ticket_note_webhooks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (ticket_note_webhooks.get(parentId, id) misses by construction)\"\n }\n },\n \"ticket_notes\": {\n \"count\": {\n \"surface\": \"ticket_notes.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_notes.get\",\n \"remedy\": \"address a record by a known id (ticket_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_notes.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_notes table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_notes.get\",\n \"remedy\": \"address a record by a known id (ticket_notes.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"ticket_notes.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the ticket_notes table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a ticket_notes update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"ticket_notes.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (ticket_notes.get(parentId, id) misses by construction)\"\n }\n },\n \"ticket_secondary_resources\": {\n \"count\": {\n \"surface\": \"ticket_secondary_resources.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_secondary_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_secondary_resources.get\",\n \"remedy\": \"address a record by a known id (ticket_secondary_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_secondary_resources.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_secondary_resources table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_secondary_resources.get\",\n \"remedy\": \"address a record by a known id (ticket_secondary_resources.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n }\n },\n \"ticket_webhooks\": {\n \"count\": {\n \"surface\": \"ticket_webhooks.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_webhooks.get\",\n \"remedy\": \"address a record by a known id (ticket_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"query\": {\n \"surface\": \"ticket_webhooks.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant's ticket_webhooks table is EMPTY FOR THIS API USER (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521: 0 rows) — a 0/empty result here is INCONCLUSIVE (empty-for-user, not tenant-level absence)\",\n \"authority\": \"ticket_webhooks.get\",\n \"remedy\": \"address a record by a known id (ticket_webhooks.get) or verify from a tenant user that owns the table — do not treat the 0 as tenant-level absence\"\n },\n \"update\": {\n \"surface\": \"ticket_webhooks.update\",\n \"kind\": \"unreadable-scoped-child\",\n \"note\": \"the ticket_webhooks table is UNREADABLE for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521 — scoped child of an empty/unowned parent) — a ticket_webhooks update target miss here is INCONCLUSIVE (the target is unreadable, not absent)\",\n \"authority\": \"ticket_webhooks.get\",\n \"remedy\": \"verify the parent first (the parent table's authority op) — for this API user the child target is unreadable (ticket_webhooks.get(parentId, id) misses by construction)\"\n }\n },\n \"time_entries\": {\n \"count\": {\n \"surface\": \"time_entries.count\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the UNFILTERED time_entries read is 0 rows for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — the visibility class is owned-only (unfiltered-blind); DATA EXISTS: postedWithin(2026-10-01..06) live 2026-10-06 returned 12 unposted rows for this user — do not treat the unfiltered 0 as tenant-level absence\",\n \"authority\": \"time_entries.get\",\n \"remedy\": \"read time entries through a bounded window (time_entries.postedWithin / the window helpers) or a filterable field; a record addressed by a known id is authoritative (time_entries.get)\"\n },\n \"query\": {\n \"surface\": \"time_entries.query\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the UNFILTERED time_entries read is 0 rows for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — the visibility class is owned-only (unfiltered-blind); DATA EXISTS: postedWithin(2026-10-01..06) live 2026-10-06 returned 12 unposted rows for this user — do not treat the unfiltered 0 as tenant-level absence\",\n \"authority\": \"time_entries.get\",\n \"remedy\": \"read time entries through a bounded window (time_entries.postedWithin / the window helpers) or a filterable field; a record addressed by a known id is authoritative (time_entries.get)\"\n },\n \"update\": {\n \"surface\": \"time_entries.update\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the UNFILTERED time_entries read is 0 rows for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — the visibility class is owned-only (unfiltered-blind); DATA EXISTS: postedWithin(2026-10-01..06) live 2026-10-06 returned 12 unposted rows for this user — do not treat the unfiltered 0 as tenant-level absence\",\n \"authority\": \"time_entries.get\",\n \"remedy\": \"read time entries through a bounded window (time_entries.postedWithin / the window helpers) or a filterable field; a record addressed by a known id is authoritative (time_entries.get)\"\n }\n },\n \"resource_time_off_balances\": {\n \"getByYear\": {\n \"surface\": \"resource_time_off_balances.getByYear\",\n \"kind\": \"tenant-empty-for-user\",\n \"note\": \"the tenant holds NO time-off balances for this API user (ww29 (australia-nz) live sweep 2026-10-04, marker FULL100-SEED-1791096521) — the NOT_FOUND here is the correct answer for an empty table, not a defect (the T1 wall)\",\n \"authority\": null,\n \"remedy\": \"the API user holds no balances — use the UI or a tenant user with balance visibility\"\n }\n },\n \"resource_time_off_additional\": {\n \"getByResource\": {\n \"surface\": \"resource_time_off_additional.getByResource\",\n \"kind\": \"shape-drift\",\n \"note\": \"known shape drift (W-D2, ww29 (australia-nz) live 2026-10-04): the vendor answers resource_time_off_additional.getByResource with a shape the vendored spec does not describe — a typed INVALID_RESPONSE here is the expected drift, not a defect\",\n \"authority\": null,\n \"remedy\": \"read the data from the sibling ops (resource_time_off_balances) or by id — the drift is in the response envelope, not the data\"\n }\n },\n \"ticket_checklist_libraries\": {\n \"create\": {\n \"surface\": \"ticket_checklist_libraries.create\",\n \"kind\": \"shape-drift\",\n \"note\": \"known shape drift (W-A7, ww29 (australia-nz) live 2026-10-04): the vendor's create response shape for ticket_checklist_libraries drifts from the vendored spec — a typed INVALID_RESPONSE here is the expected drift, not a defect\",\n \"authority\": null,\n \"remedy\": \"verify the created record by id (ticket_checklist_libraries.get) — the create may have succeeded despite the drifted envelope\"\n }\n }\n};\n\n/**\n * The known-unusable-op pointer sentences keyed by operation (issue #14):\n * the note rides on the op's typed error (details.pointerNote) and on the\n * record's metadata.pointerNote (the describe channel). No behaviour change\n * — the status/error code are untouched; the pointer routes the caller to\n * the operation that works.\n */\nexport const POINTER_NOTES: Record<string, string> = {\n \"ticket_history.query\": \"W1 (ww29 (australia-nz) live 2026-10-04; vendor contract change live-verified 2026-10-06): the vendor requires ticket_history.query to be supplied with exactly ONE ticketID-equals filter — an unfiltered call 500s by contract (10-06 text: \\\"When querying the TicketHistory entity you are required to supply one and only one ticketID equals filter\\\"). WITH the filter the query WORKS (live 2026-10-06: rows returned, hasMore true — a single {op:'eq', field:'ticketID', value:<id>} condition; the filter vocabulary is eq/noteq/gt/gte/lt/lte/beginsWith/endsWith/contains/exist/notExist/in/notIn/and/or). tickets.timeline / tickets.fullContext remain the convenient composites; raw history rows come from the filtered query.\",\n \"time_entries.create\": \"W-A3 (ww29 (australia-nz) live 2026-10-04; drift re-verified 2026-10-06): the vendor now refuses ALL time-entry writes for this API-only user with \\\"API-only user cannot be selected for this field\\\" (10-04 text: \\\"The specified AssignedResourceID and AssignedRoleID combination is not currently defined\\\"). UNSATISFIABLE for an API-only integration user: the resources table is blind (0 rows) and the only selectable resource is the user's own API-only record, which the vendor refuses. createForResource — stage-11 PROVEN (8 live creates, 10-04) — is walled by the SAME drift (confirm-100 receipt 2026-10-06). Tenant evidence that valid pairs exist: postedWithin rows (resourceID 31131373 / 29869529 with roleID 29682834) — human resources the API user cannot select.\",\n \"time_entries.getPosted\": \"W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified 2026-10-04): this zone's TimeEntry entity exposes NO posted-state filter field — the vendor rejects postingStatus, postedDate and status with \\\"Unable to find X in the TimeEntry Entity\\\" (live field-existence oracle 2026-10-04: only dateWorked / resourceID / ticketID / taskID resolve as filter fields). A 500 here is the known wall, not a transient fault: posted cannot be filtered server-side on this zone — use time_entries.postedWithin (the dateWorked window, live-verified working) or read time_entries.query and derive posted-state from the fields your zone's entity exposes\",\n \"time_entries.getUnposted\": \"W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified 2026-10-04): this zone's TimeEntry entity exposes NO posted-state filter field — the vendor rejects postingStatus, postedDate and status with \\\"Unable to find X in the TimeEntry Entity\\\" (live field-existence oracle 2026-10-04: only dateWorked / resourceID / ticketID / taskID resolve as filter fields). A 500 here is the known wall, not a transient fault: unposted cannot be filtered server-side on this zone — use time_entries.postedWithin (the dateWorked window, live-verified working) or read time_entries.query and derive posted-state from the fields your zone's entity exposes\",\n \"authenticate.get\": \"W2: authenticate.get is DESIGNATOR-ONLY — it returns the designator identity, not a tenant data surface; a miss/empty here is not a data-empty signal (no emptyReason is attached by design — a false reason would be worse than none)\"\n};\n/**\n * The blind-surface inventory (issue #11) — the 116-surface discovery\n * artifact (plan.reachability, campaign transfer) served ZERO-wire by\n * operations.blindSurfaces. The 6 pinned blindSurfaces stamps keep their\n * byte-identical wording (the pinned trio's remedies.byResource entries are\n * the pin's own note text); the 69 blind / 46 data-full / 1 vendor-500\n * split is zone-specific (ww29) — the zone label travels with it.\n */\nexport const BLIND_SURFACE_INVENTORY: BlindSurfaceInventory = {\n \"zone\": \"ww29\",\n \"label\": \"australia-nz\",\n \"verifiedAt\": \"2026-10-03\",\n \"discoveredAt\": \"2026-10-04\",\n \"surfaces\": [\n {\n \"resource\": \"appointments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"appointments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). appointments.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"billing_codes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"billing_codes.get\",\n \"note\": \"billing_codes count/query are pinned blind in this zone (plan.blindSurfaces pin, byte-identical sentinel) — the discovery sweep confirmed 0 rows unfiltered (limit-2 read, marker FULL100-SEED-1791096521); get(id) is the authority.\",\n \"proof\": \"live-verified\"\n },\n {\n \"resource\": \"billing_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"billing_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). billing_items.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"change_request_links\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"change_request_links.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). change_request_links.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"checklist_libraries\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"checklist_libraries.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"checklist_library_checklist_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"checklist_library_checklist_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"classification_icons\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"classification_icons.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). classification_icons.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"companies\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unowned-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"companies.get\",\n \"note\": \"companies count/query are pinned blind in this zone (plan.blindSurfaces pin, byte-identical sentinel) — the discovery sweep confirmed 0 rows unfiltered (limit-2 read, marker FULL100-SEED-1791096521); get(id) is the authority.\",\n \"proof\": \"live-verified\"\n },\n {\n \"resource\": \"company_alerts\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"company_alerts.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). company_alerts.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"company_locations\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"company_locations.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"company_notes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"company_notes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). company_notes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"company_site_configurations\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"company_site_configurations.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). company_site_configurations.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"company_webhooks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"company_webhooks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). company_webhooks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_billing_product_associations\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"configuration_item_billing_product_associations.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). configuration_item_billing_product_associations.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_categories\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_categories.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_category_udf_associations\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_category_udf_associations.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_dns_records\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_dns_records.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_notes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_notes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_related_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_related_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_ssl_subject_alternative_names\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"configuration_item_ssl_subject_alternative_names.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_types\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"configuration_item_types.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). configuration_item_types.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_item_webhooks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"configuration_item_webhooks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). configuration_item_webhooks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"configuration_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"configuration_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). configuration_items.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contact_group_contacts\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"contact_group_contacts.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contact_groups\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"contact_groups.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contact_webhooks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contact_webhooks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contact_webhooks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contacts\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contacts.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contacts.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_billing_rules\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_billing_rules.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_billing_rules.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_block_hour_factors\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_block_hour_factors.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_block_hour_factors.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_blocks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_blocks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_blocks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_charges\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_charges.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_charges.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_exclusion_billing_codes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_exclusion_billing_codes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_exclusion_billing_codes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_exclusion_roles\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_exclusion_roles.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_exclusion_roles.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_exclusion_set_excluded_roles\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"contract_exclusion_set_excluded_roles.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_exclusion_set_excluded_work_types\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 1,\n \"authority\": \"contract_exclusion_set_excluded_work_types.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 1 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_exclusion_sets\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 1,\n \"authority\": \"contract_exclusion_sets.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 1 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_milestones\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_milestones.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_milestones.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_notes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_notes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_notes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_rates\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_rates.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_rates.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_retainers\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_retainers.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_retainers.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_role_costs\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_role_costs.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_role_costs.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_service_bundle_units\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_service_bundle_units.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_service_bundle_units.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_service_bundles\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_service_bundles.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_service_bundles.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_service_units\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_service_units.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_service_units.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_services\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_services.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_services.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contract_ticket_purchases\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contract_ticket_purchases.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contract_ticket_purchases.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"contracts\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"contracts.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). contracts.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"countries\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"countries.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). countries.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"departments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"departments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"domain_registrars\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"domain_registrars.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"expense_item_attachments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"expense_item_attachments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"expense_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"expense_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). expense_items.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"expense_reports\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"expense_reports.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). expense_reports.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"holiday_sets\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"holiday_sets.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"holidays\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"holidays.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"inventory_products\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 1,\n \"authority\": \"inventory_products.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 1 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"invoices\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"invoices.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). invoices.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"notification_history\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"notification_history.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). notification_history.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"opportunities\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"opportunities.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"opportunity_attachments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"opportunity_attachments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"opportunity_categories\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"opportunity_categories.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"phases\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"phases.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"product_vendors\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"product_vendors.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). product_vendors.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"products\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"products.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). products.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"project_charges\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"project_charges.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). project_charges.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"project_notes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"project_notes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). project_notes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"projects\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"projects.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"purchase_approvals\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"purchase_approvals.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). purchase_approvals.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"purchase_order_item_receiving\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"purchase_order_item_receiving.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"purchase_order_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"purchase_order_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). purchase_order_items.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"purchase_orders\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"purchase_orders.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). purchase_orders.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"quote_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"quote_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). quote_items.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"quote_locations\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"quote_locations.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). quote_locations.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"quote_templates\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"quote_templates.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). quote_templates.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"quotes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"quotes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). quotes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"resource_role_queues\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"resource_role_queues.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"resource_roles\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"resource_roles.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). resource_roles.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"resource_skills\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"resource_skills.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). resource_skills.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"resource_time_off_approvers\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"resource_time_off_approvers.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"resources\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"resources.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). resources.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"roles\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"roles.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_call_task_resources\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"service_call_task_resources.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). service_call_task_resources.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_call_tasks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"service_call_tasks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). service_call_tasks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_call_ticket_resources\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"service_call_ticket_resources.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). service_call_ticket_resources.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_call_tickets\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"service_call_tickets.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). service_call_tickets.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_calls\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"service_calls.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). service_calls.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"service_level_agreement_results\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"service_level_agreement_results.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"services\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"services.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). services.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"skills\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"skills.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). skills.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"subscription_periods\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"subscription_periods.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). subscription_periods.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"subscriptions\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"subscriptions.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). subscriptions.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"survey_results\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"survey_results.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"surveys\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"surveys.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"tag_aliases\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"tag_aliases.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"tag_groups\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"tag_groups.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"tags\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"tags.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"task_secondary_resources\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"task_secondary_resources.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"tasks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"tasks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_additional_configuration_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_additional_configuration_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_additional_contacts\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_additional_contacts.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_attachments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_attachments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_categories\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_categories.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_category_field_defaults\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_category_field_defaults.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_change_request_approvals\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_change_request_approvals.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_change_request_approvals.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_charges\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_charges.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_charges.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_checklist_items\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_checklist_items.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_history\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": null,\n \"authority\": \"ticket_history.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered query 500s at the vendor (W1: the TicketHistory query requires a parentId the unfiltered call cannot supply) — no row count observable; use tickets.timeline / tickets.fullContext for ticket history data.\",\n \"proof\": \"live-verified\"\n },\n {\n \"resource\": \"ticket_note_attachments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"ticket_note_attachments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_note_webhooks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_note_webhooks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_note_webhooks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_notes\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_notes.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_notes.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_secondary_resources\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_secondary_resources.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_secondary_resources.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"ticket_webhooks\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"ticket_webhooks.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). ticket_webhooks.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"tickets\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"tickets.get\",\n \"note\": \"tickets count/query are pinned blind in this zone (plan.blindSurfaces pin, byte-identical sentinel) — the discovery sweep confirmed 0 rows unfiltered (limit-2 read, marker FULL100-SEED-1791096521); get(id) is the authority.\",\n \"proof\": \"live-verified\"\n },\n {\n \"resource\": \"time_entries\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unfiltered-blind\",\n \"unfilteredRows\": 0,\n \"authority\": \"time_entries.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 0 rows — INCONCLUSIVE (tenant-empty-for-user vs blind for this API user; a 0/empty result here proves nothing). time_entries.get is the authority for a specific record.\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"time_entry_attachments\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"time_entry_attachments.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n },\n {\n \"resource\": \"time_off_requests\",\n \"ops\": [\n \"count\",\n \"query\"\n ],\n \"kind\": \"unknown\",\n \"unfilteredRows\": 2,\n \"authority\": \"time_off_requests.get\",\n \"note\": \"ww29 discovery sweep (marker FULL100-SEED-1791096521, 2026-10-04): the unfiltered limit-2 read returned 2 row(s) — data-full for this API user (unfiltered reads are safe here; no blind class assigned).\",\n \"proof\": \"discovery-sweep\"\n }\n ],\n \"counts\": {\n \"total\": 116,\n \"dataFull\": 46,\n \"blind\": 69,\n \"pinned\": 6\n },\n \"dataFull\": [\n \"checklist_libraries\",\n \"checklist_library_checklist_items\",\n \"company_locations\",\n \"configuration_item_categories\",\n \"configuration_item_category_udf_associations\",\n \"configuration_item_dns_records\",\n \"configuration_item_notes\",\n \"configuration_item_related_items\",\n \"configuration_item_ssl_subject_alternative_names\",\n \"contact_group_contacts\",\n \"contact_groups\",\n \"contract_exclusion_set_excluded_roles\",\n \"contract_exclusion_set_excluded_work_types\",\n \"contract_exclusion_sets\",\n \"departments\",\n \"domain_registrars\",\n \"expense_item_attachments\",\n \"holiday_sets\",\n \"holidays\",\n \"inventory_products\",\n \"opportunities\",\n \"opportunity_attachments\",\n \"opportunity_categories\",\n \"phases\",\n \"projects\",\n \"purchase_order_item_receiving\",\n \"resource_role_queues\",\n \"resource_time_off_approvers\",\n \"roles\",\n \"service_level_agreement_results\",\n \"survey_results\",\n \"surveys\",\n \"tag_aliases\",\n \"tag_groups\",\n \"tags\",\n \"task_secondary_resources\",\n \"tasks\",\n \"ticket_additional_configuration_items\",\n \"ticket_additional_contacts\",\n \"ticket_attachments\",\n \"ticket_categories\",\n \"ticket_category_field_defaults\",\n \"ticket_checklist_items\",\n \"ticket_note_attachments\",\n \"time_entry_attachments\",\n \"time_off_requests\"\n ],\n \"remedies\": {\n \"generic\": \"on a 0/empty result from an unfiltered read: the result is INCONCLUSIVE for this API user (tenant-empty-for-user vs blind) — address a record by a known id via the authority op (e.g. <resource>.get), verify from a tenant user that owns the table, or run operations.probeReachability (caller-opted, capped) on this tenant to re-discover.\",\n \"byResource\": {\n \"billing_codes\": \"the UNFILTERED billing_codes count/query surface is blind in ww29 (live-verified). Query with `useType` (1 = general, 3 = internal) + `isActive` filters — filtered queries return real data; time_entries.createForResource always applies them for you. get(id) is the authority.\",\n \"companies\": \"companies count/query return 0/empty for companies not owned by the caller (ww29, live-verified: 0 before AND after a proven live create). A 0/empty result on this surface proves nothing — get(id) is the authority: it returns the record even while count/query are blind.\",\n \"tickets\": \"the UNFILTERED tickets count/query surface is blind in ww29 (live-verified: 0 before AND after a proven live create). FILTERED queries return data (live-verified: 3 open tickets via a companyID+status filter) — a filtered empty result is a TRUE absence, never a sentinel. An unfiltered 0/empty result proves nothing — get(id) is the authority.\"\n }\n }\n};\n\n/**\n * The probe defaults (issue #11): the hard wire cap (80), the default cap\n * (40), the limit bounds (1-2, default 2) and the default target set — the\n * derived non-data-full rows (the 70 surfaces a re-discovery sweep starts\n * from: the 69 blind + ticket_history). Served zero-wire; the gate\n * re-derives the target set, so it cannot drift from the inventory.\n */\nexport const REACHABILITY_PROBE_DEFAULTS: ProbeDefaults = {\n \"defaultCap\": 40,\n \"hardCap\": 80,\n \"limitDefault\": 2,\n \"limitMax\": 2,\n \"defaultTargets\": [\n \"appointments\",\n \"billing_codes\",\n \"billing_items\",\n \"change_request_links\",\n \"classification_icons\",\n \"companies\",\n \"company_alerts\",\n \"company_notes\",\n \"company_site_configurations\",\n \"company_webhooks\",\n \"configuration_item_billing_product_associations\",\n \"configuration_item_types\",\n \"configuration_item_webhooks\",\n \"configuration_items\",\n \"contact_webhooks\",\n \"contacts\",\n \"contract_billing_rules\",\n \"contract_block_hour_factors\",\n \"contract_blocks\",\n \"contract_charges\",\n \"contract_exclusion_billing_codes\",\n \"contract_exclusion_roles\",\n \"contract_milestones\",\n \"contract_notes\",\n \"contract_rates\",\n \"contract_retainers\",\n \"contract_role_costs\",\n \"contract_service_bundle_units\",\n \"contract_service_bundles\",\n \"contract_service_units\",\n \"contract_services\",\n \"contract_ticket_purchases\",\n \"contracts\",\n \"countries\",\n \"expense_items\",\n \"expense_reports\",\n \"invoices\",\n \"notification_history\",\n \"product_vendors\",\n \"products\",\n \"project_charges\",\n \"project_notes\",\n \"purchase_approvals\",\n \"purchase_order_items\",\n \"purchase_orders\",\n \"quote_items\",\n \"quote_locations\",\n \"quote_templates\",\n \"quotes\",\n \"resource_roles\",\n \"resource_skills\",\n \"resources\",\n \"service_call_task_resources\",\n \"service_call_tasks\",\n \"service_call_ticket_resources\",\n \"service_call_tickets\",\n \"service_calls\",\n \"services\",\n \"skills\",\n \"subscription_periods\",\n \"subscriptions\",\n \"ticket_change_request_approvals\",\n \"ticket_charges\",\n \"ticket_history\",\n \"ticket_note_webhooks\",\n \"ticket_notes\",\n \"ticket_secondary_resources\",\n \"ticket_webhooks\",\n \"tickets\",\n \"time_entries\"\n ]\n};\n\n/**\n * The zone-fact create-guidance catalog (issue #12) — the 92-entity stage-\n * 11 apply-matrix artifact (campaign transfer; marker FULL100W-1791110339)\n * served ZERO-wire by operations.createGuidance. One row per plan create op:\n * the live-proven required-field prefix (vendor-demand order), the\n * structured blocker (the wall class + remedy), the EXACT vendor message\n * text (never paraphrased), and the spec-derived delete boundary (W-A1).\n * The kind distribution is zone-specific (ww29) — the zone label travels\n * with it.\n */\nexport const CREATE_GUIDANCE: CreateGuidanceReport = {\n \"zone\": \"ww29\",\n \"label\": \"australia-nz\",\n \"verifiedAt\": \"2026-10-03\",\n \"rows\": [\n {\n \"resource\": \"appointments\",\n \"createOp\": \"appointments.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"title\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"appointments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ae6ff4b1-553b-48e0-b4fe-00c72964b268\\\",\\\"message\\\":\\\"Value does not exist for the required f\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"change_request_links\",\n \"createOp\": \"change_request_links.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"change_request_links.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"2d747061-00ea-4b40-b3fc-740882492457\\\",\\\"message\\\":\\\"Value does not exist for the re\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"checklist_libraries\",\n \"createOp\": \"checklist_libraries.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"entityType\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"checklist_library_checklist_items\",\n \"createOp\": \"checklist_library_checklist_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"itemName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"companies\",\n \"createOp\": \"companies.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"companyName\",\n \"companyType\",\n \"phone\",\n \"ownerResourceID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 companies); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"companies.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"companies.delete\\\\\\\" — it is not in the capability reg\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for companies (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"company_alerts\",\n \"createOp\": \"company_alerts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"alertText\",\n \"alertTypeID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"company_alerts.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"company_locations\",\n \"createOp\": \"company_locations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"company_notes\",\n \"createOp\": \"company_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"actionType\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"company_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7ef594cb-74dd-4a29-a7f7-2a5d5eb515f0\\\",\\\"message\\\":\\\"Value does not exist for the required \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for company_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"company_webhooks\",\n \"createOp\": \"company_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"company_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_billing_product_associations\",\n \"createOp\": \"configuration_item_billing_product_associations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"billingProductID\",\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the billingProductID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the billingProductID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"billingProductID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_billing_product_associations.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c2bf3080-c882-4ff2-b440-159686687978\\\",\\\"message\\\":\\\"Refe\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_categories\",\n \"createOp\": \"configuration_item_categories.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"displayColorRgb\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for displayColorRgb .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the displayColorRgb reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"displayColorRgb\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for displayColorRgb .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_categories.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"fc4cb7ec-610c-47a3-8625-29b24f253601\\\",\\\"message\\\":\\\"Could not convert stri\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_item_categories (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_category_udf_associations\",\n \"createOp\": \"configuration_item_category_udf_associations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"userDefinedFieldDefinitionID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_category_udf_associations.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"89cf29e9-db4a-4834-b5fa-6344d2213569\\\",\\\"message\\\":\\\"Field '\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_notes\",\n \"createOp\": \"configuration_item_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"description\",\n \"noteType\",\n \"title\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for noteType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the noteType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"noteType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for noteType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ec6c5845-d79a-43ec-b4e3-1a0a1d01cc8f\\\",\\\"message\\\":\\\"Field 'title': Missing Requ\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_item_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_related_items\",\n \"createOp\": \"configuration_item_related_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"relatedConfigurationItemID\",\n \"relationship\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Reference value on field: configurationItemID of type: ConfigurationItem does not exist or is invalid.\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"Reference value on field: configurationItemID of type: ConfigurationItem does not exist or is invalid.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_related_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"20327421-a229-4361-bfe9-c527ec75ae5a\\\",\\\"message\\\":\\\"Reference value on \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_types\",\n \"createOp\": \"configuration_item_types.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"configuration_item_types.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_item_webhooks\",\n \"createOp\": \"configuration_item_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"webhookUrl\",\n \"deactivationUrl\",\n \"secretKey\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_item_webhooks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"f348c45e-80e0-4632-9dc9-d04796ea03ab\\\",\\\"message\\\":\\\"A ConfigurationItemWebho\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"configuration_items\",\n \"createOp\": \"configuration_items.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"companyID\",\n \"productID\",\n \"isActive\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"configuration_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9b17f254-654d-4bdc-94bd-d7fc0ff8f4ff\\\",\\\"message\\\":\\\"Value does not exist for the req\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for configuration_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contact_group_contacts\",\n \"createOp\": \"contact_group_contacts.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"NOT_FOUND\\\",\\\"category\\\":\\\"not_found\\\",\\\"retryable\\\":false,\\\"httpStatus\\\":404,\\\"operation\\\":\\\"contact_group_contacts.create\\\",\\\"suggestedAction\\\":\\\"Verify the id, or resolve the record by name first.\\\",\\\"correlationId\\\":\\\"f84411bb-c115-41af-8690-74a6283b9768\\\",\\\"message\\\":\\\"Resource not found: <!DOCTY\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contact_groups\",\n \"createOp\": \"contact_groups.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contact_webhooks\",\n \"createOp\": \"contact_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"contact_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contacts\",\n \"createOp\": \"contacts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"firstName\",\n \"lastName\",\n \"companyID\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_billing_rules\",\n \"createOp\": \"contract_billing_rules.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"productID\",\n \"isActive\",\n \"startDate\",\n \"determineUnits\",\n \"createChargesAsBillable\",\n \"includeItemsInChargeDescription\",\n \"isDailyProrationEnabled\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382), current full text: 'productID [1] is invalid. Products with a BillingType of 'Standard'[1] cannot be associated to ContractBillingRules.' — a product with an ELIGIBLE (non-Standard) BillingType is required; the products table is blind for this API user — UNSATISFIABLE for this user. (10-04 ladder had stopped at isDailyProrationEnabled + 'productID [1] is invalid. Products with a'.)\",\n \"remedy\": \"a product with a non-Standard BillingType is required (products table blind for this user) — provision/read an eligible product in the Autotask UI or use a user where the products table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_billing_rules.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"62ba9fcf-91ae-42a3-bc50-9911442eb738\\\",\\\"message\\\":\\\"Reference value on field: con\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_block_hour_factors\",\n \"createOp\": \"contract_block_hour_factors.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): write path proven via the vendor's unique-key wall — 'A ContractBlockHourFactor for this roleID and contractID combination already exists' (pair (30131842, 29685291) pre-existing from the rates attach). Fields roleID (+ the unique key).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_block_hour_factors.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8095334f-1e14-4185-b5dc-99e5526e526d\\\",\\\"message\\\":\\\"Value does not exist for\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_block_hour_factors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_blocks\",\n \"createOp\": \"contract_blocks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"hours\",\n \"hourlyRate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114389. TYPE GATE: parent MUST be type 4 (Block hours) — 'This ContractBlock must reference a Contract of type 4 (Block hours) with contractID'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_blocks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ea12c341-d1d3-4622-b73c-45e871ed1f91\\\",\\\"message\\\":\\\"Reference value on field: contractID\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_blocks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_charges\",\n \"createOp\": \"contract_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the contracts table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"ed78a2ec-b5e2-4e5f-989b-4c39bee66567\\\",\\\"message\\\":\\\"Reference value on field: contractI\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_exclusion_billing_codes\",\n \"createOp\": \"contract_exclusion_billing_codes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field billingCodeID.' — the billing-allocation table is blind for this API user (no resolvable allocation code for this user's contracts) — UNSATISFIABLE for this user.\",\n \"remedy\": \"an allocation code (billingCodeID) readable by this user is required (table blind) — provision in the Autotask UI or use a user where allocation codes are visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_billing_codes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8ef9f8ea-5846-4128-bbcc-b523061c585f\\\",\\\"message\\\":\\\"Reference value on \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_exclusion_roles\",\n \"createOp\": \"contract_exclusion_roles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 187; field roleID. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_roles.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"76f0c480-232b-4bfd-aa1e-c9cd3858d717\\\",\\\"message\\\":\\\"Value does not exist for th\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_exclusion_set_excluded_roles\",\n \"createOp\": \"contract_exclusion_set_excluded_roles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"excludedRoleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified — batch1-final recovery, id 3; the surviving per-resource receipts predate the recovery)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"csxroles: {\\\"id\\\": 3, \\\"final\\\": \\\"RECOVERED\\\"} (batch1-final.json) — verify-gone=True (batch1-final.log)\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_exclusion_set_excluded_work_types\",\n \"createOp\": \"contract_exclusion_set_excluded_work_types.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"excludedWorkTypeID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the excludedWorkTypeID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the excludedWorkTypeID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"excludedWorkTypeID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_exclusion_set_excluded_work_types.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b900823d-cf16-4eea-a26b-ea1df9b13d70\\\",\\\"message\\\":\\\"Reference\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_exclusion_sets\",\n \"createOp\": \"contract_exclusion_sets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_milestones\",\n \"createOp\": \"contract_milestones.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"dateDue\",\n \"amount\",\n \"isInitialPayment\",\n \"status\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 1338. TYPE GATE (vendor): the parent contract MUST be type 3 (Fixed Price) — 'ContractMilestones may only have a contractID linking to Contracts of type 3 (Fixed Price)'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_milestones.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"cfa41884-3855-4729-983f-733f52ef7320\\\",\\\"message\\\":\\\"Reference value on field: contra\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_milestones (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_notes\",\n \"createOp\": \"contract_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"description\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 35573321 under contract 30131842; fields title + description. Residue (no vendor DELETE).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"bc5bfb0b-79c1-4bde-882b-7cd16c77f6cd\\\",\\\"message\\\":\\\"Reference value on field: contractID \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_rates\",\n \"createOp\": \"contract_rates.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"contractHourlyRate\",\n \"roleID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30083427; fields contractHourlyRate + roleID (an owned/visible role). Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_rates.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"a829126b-68db-4fac-89ba-56c6ad725eef\\\",\\\"message\\\":\\\"Value does not exist for the required\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_rates (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_retainers\",\n \"createOp\": \"contract_retainers.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"amount\",\n \"status\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114390. TYPE GATE: parent MUST be type 6 (Retainer). Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_retainers.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d4fb4798-c02b-4c19-b3fa-b1629ae9113a\\\",\\\"message\\\":\\\"Reference value on field: contrac\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_retainers (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_role_costs\",\n \"createOp\": \"contract_role_costs.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"rate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"resource-role-pair\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'The specified resourceID and roleID combination is not currently defined.' — a currently-DEFINED (resource, role) assignment is required; the resource_roles table is blind for this user (0 rows) — same pair-validation family as W-A3; UNSATISFIABLE for this user.\",\n \"remedy\": \"a currently-DEFINED (resource, role) assignment is required (resource_roles blind for this user) — same family as W-A3; use a user with readable assignments or manage role costs in the Autotask UI\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_role_costs.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c64d8ace-bdf3-46e9-ba24-1e8989aa73ef\\\",\\\"message\\\":\\\"Value does not exist for the req\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_role_costs (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_service_adjustments\",\n \"createOp\": \"contract_service_adjustments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382), current full text: the parent contract must be type 7 (Recurring Services) or 'umbrella' ('Unable to create a ContractServiceAdjustment with a contractID that is not of type recurring Service or umbrella'); under a type-7 parent the vendor then requires an ACTIVE serviceID — 'Unable to create a ContractServiceAdjustment with a serviceID of 1 because that Service is not active'. The services table is blind for this API user (no readable active service id) — UNSATISFIABLE for this user.\",\n \"remedy\": \"an ACTIVE serviceID visible to this API user is required (services table blind for this user) — provision the active service in the Autotask UI or use a user where services are readable; parent must be type 7 (Recurring) or 'umbrella'\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_adjustments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"fc363aaa-2d29-4f86-8e8f-2871c6b09401\\\",\\\"message\\\":\\\"Reference value on fiel\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_service_bundle_adjustments\",\n \"createOp\": \"contract_service_bundle_adjustments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"effectiveDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"W-A7-class drift, re-verified 2026-10-06 (confirm-100 CONF100-1791187382): the vendor answers HTTP 200 with a body that is NOT OperationResultModel — the node (spec-conformant) types INVALID_RESPONSE; the record may be created with an unparseable id (blind table). TYPE GATE: the parent contract must be type 7 (Recurring Services) — '…with a contractID that is not of type recurring Service'. VENDOR-FIX (response shape) required.\",\n \"remedy\": \"vendor response-shape fix required (W-A7-class 200 drift) — treat the INVALID_RESPONSE as the typed wall; parent must be type 7 (Recurring Services); manage the adjustment in the Autotask UI meanwhile\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_bundle_adjustments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"a1899b6f-015a-4c32-aaa8-eabeabb30165\\\",\\\"message\\\":\\\"Reference value \",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Expected OperationResultModel { itemId } (or { id }); got a different shape\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_bundle_adjustments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_service_bundles\",\n \"createOp\": \"contract_service_bundles.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field serviceBundleID.' — the service-bundles table is blind for this API user — UNSATISFIABLE for this user.\",\n \"remedy\": \"a service-bundles-table record visible to this user is required (table blind, 0 rows) — provision in the Autotask UI or use a user where the table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_service_bundles.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"032e3caa-4527-467f-b459-0cb80cfd1ad2\\\",\\\"message\\\":\\\"Value does not exist for th\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_service_bundles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_services\",\n \"createOp\": \"contract_services.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382): 'Value does not exist for the required field serviceID.' — the services table is blind for this API user (0 rows; no readable service id) — UNSATISFIABLE for this user.\",\n \"remedy\": \"a services-table record visible to this user is required (table blind, 0 rows) — provision in the Autotask UI or use a user where the table is visible\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_services.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c5003db3-bd6a-4970-aeb7-c13b32849acd\\\",\\\"message\\\":\\\"Value does not exist for the requi\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contract_ticket_purchases\",\n \"createOp\": \"contract_ticket_purchases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"ticketsPurchased\",\n \"startDate\",\n \"endDate\",\n \"datePurchased\",\n \"perTicketRate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 30114391. TYPE GATE: parent MUST be type 8 (PerTicket incident) — 'The Contract associated by contractID must be of type PerTicket (incident)'. Residue.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contract_ticket_purchases.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"268901a8-7fdd-4e9a-9731-92f840ac73bd\\\",\\\"message\\\":\\\"Reference value on field: \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contract_ticket_purchases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"contracts\",\n \"createOp\": \"contracts.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"status\",\n \"contractType\",\n \"contractName\",\n \"startDate\",\n \"endDate\",\n \"timeReportingRequiresStartAndStopTimes\",\n \"companyID\",\n \"estimatedRevenue\",\n \"estimatedHours\",\n \"estimatedCost\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100, marker CONF100-1791187382): the W-A6 'blind parent' was companyID — an OWNED company satisfies it (seed 30132785). Proven contractType values: 1, 3 (Fixed Price), 4 (Block hours), 6 (Retainer), 7 (Recurring Services), 8 (PerTicket incident); type 5 is an invalid picklist value. Type-specific extra fields: types 1/3/4/6/8 require estimatedRevenue (type 1 additionally estimatedHours + estimatedCost); type 7 additionally contractPeriodType (2 valid) + setupFee. Proven ids 30131842-30131847 (residue — no vendor DELETE for contracts).\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"contracts.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"25d4a730-6d6c-49ff-a038-96d3fd09165d\\\",\\\"message\\\":\\\"Value does not exist for the required fiel\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100 (CONF100-1791187382)\\\", \\\"result\\\": \\\"OperationResultModel id=30131842 (type 1)\\\", \\\"ladder\\\": \\\"status -> endDate/timeReporting/contractType/contractName/startDate -> 'Contracts of type 1 require an estimatedRevenue' -> estimatedHours -> estimatedCost\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for contracts (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"departments\",\n \"createOp\": \"departments.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"primaryLocationID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for primaryLocationID.\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the primaryLocationID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"primaryLocationID\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for primaryLocationID.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"departments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"4197e8a1-0411-45cb-b4a1-e770f4bae5e9\\\",\\\"message\\\":\\\"Value does not reference an existing ent\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for departments (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"domain_registrars\",\n \"createOp\": \"domain_registrars.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 domain_registrars); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"domain_registrars.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"domain_registrars.delete\\\\\\\" — it is not in th\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for domain_registrars (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"expense_item_attachments\",\n \"createOp\": \"expense_item_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"Field 'Type': Missing Required Field: Type.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\",\n \"referenceField\": \"Type\"\n },\n \"vendorEvidence\": [\n \"Field 'Type': Missing Required Field: Type.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_item_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c4c16666-8398-48ea-88e2-fd6236d1a447\\\",\\\"message\\\":\\\"Field 'Type': Missing Requi\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"expense_items\",\n \"createOp\": \"expense_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"paymentType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the expense_reports table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"178f9509-d97a-4e69-9e4b-f7af67d98e64\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for expense_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"expense_reports\",\n \"createOp\": \"expense_reports.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"weekEnding\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"expense_reports.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9363affe-7779-4bac-bd81-49423574fbc8\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for expense_reports (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"holiday_sets\",\n \"createOp\": \"holiday_sets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"holidaySetName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"holidays\",\n \"createOp\": \"holidays.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"holidayName\",\n \"holidayDate\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"inventory_products\",\n \"createOp\": \"inventory_products.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"productID\",\n \"quantityMaximum\",\n \"inventoryLocationID\",\n \"quantityMinimum\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the productID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the productID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"productID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"inventory_products.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d27710fa-5cb6-455a-bc60-99c6efe2b810\\\",\\\"message\\\":\\\"Field 'quantityMinimum': Missing \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"opportunities\",\n \"createOp\": \"opportunities.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"name\",\n \"title\",\n \"companyID\",\n \"ownerResourceID\",\n \"amount\",\n \"cost\",\n \"startDate\",\n \"projectedCloseDate\",\n \"stage\",\n \"status\",\n \"probability\",\n \"useQuoteTotals\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"undocumented-ladder\",\n \"message\": \"Field 'useQuoteTotals': Missing Required Field: useQuoteTotals. | Value does not exist for the required field useQuoteTotals. \",\n \"remedy\": \"the vendor required-field ladder is undocumented and UNPROVEN (12 fields consumed before the campaign stopped — W-A5); no known field set makes this create succeed on ww29 — treat it as unavailable for this tenant and file the gap with the vendor.\"\n },\n \"vendorEvidence\": [\n \"Field 'useQuoteTotals': Missing Required Field: useQuoteTotals. | Value does not exist for the required field useQuoteTotals. \",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"opportunities.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b18b6fa2-5fba-4cbe-8657-b2805798c736\\\",\\\"message\\\":\\\"Field 'startDate': Missing Required Fi\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for opportunities (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"opportunity_attachments\",\n \"createOp\": \"opportunity_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"vendor 500: the Type picklist values are not exposed to this API user (File/Document/Image/Other all rejected — W-A4)\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\",\n \"referenceField\": \"Type\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"opportunity_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"83dcbf4f-7e56-4602-b52b-04db2f3455d2\\\",\\\"message\\\":\\\"Field 'Type': Missing Requir\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"phases\",\n \"createOp\": \"phases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"title\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (known id 527128, marker name FULL100W-1791110339 phases); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"residue.json: phases id 527128 (known id, undeletable by vendor wall W-A1; phases.get is scoped — the id is retained in the ledger)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for phases (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"product_vendors\",\n \"createOp\": \"product_vendors.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isDefault\",\n \"isActive\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the products table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"product_vendors.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9aecd016-c8fa-4940-b54a-6e875d43aba7\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for product_vendors (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"products\",\n \"createOp\": \"products.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"isSerialized\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"products.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"3f1bd9a6-28bb-4fb4-b851-07b5f90a8a3d\\\",\\\"message\\\":\\\"Value does not exist for the required field\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for products (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"project_charges\",\n \"createOp\": \"project_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the projects table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"project_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"664ab2ea-408f-4834-a331-eb5dd55ac557\\\",\\\"message\\\":\\\"A productID or a billingCodeID must \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"project_notes\",\n \"createOp\": \"project_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"noteType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"project_notes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d11a453b-729e-4908-8c6d-8549b72e8d0c\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for project_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"projects\",\n \"createOp\": \"projects.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"projectName\",\n \"startDateTime\",\n \"endDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for projectType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the projectType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"projectType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for projectType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"projects.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7a611ce5-b863-460d-8911-f850d546fd0a\\\",\\\"message\\\":\\\"Field 'endDateTime': Missing Required Field\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for projects (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"purchase_order_item_receiving\",\n \"createOp\": \"purchase_order_item_receiving.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"quantityNowReceiving\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 purchase_order_item_receiving); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"not found on a visible surface (record may predate the marker value or was created with a different value)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_order_item_receiving (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"purchase_order_items\",\n \"createOp\": \"purchase_order_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitCost\",\n \"quantity\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"vendor 500: reference rejection on order (exact vendor text preserved verbatim in vendorEvidence — campaign receipt artifact, as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"purchase_order_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"1a4f90a8-2add-47f3-bc93-74e972f7fb5e\\\",\\\"message\\\":\\\"Reference value on field: order\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_order_items (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"purchase_orders\",\n \"createOp\": \"purchase_orders.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"shipToAddress1\",\n \"status\",\n \"shipToName\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"purchase_orders.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"8cefa9ef-8cfd-46b3-baef-fe64b3d2b999\\\",\\\"message\\\":\\\"Value does not exist for the require\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for purchase_orders (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"quote_items\",\n \"createOp\": \"quote_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isOptional\",\n \"unitDiscount\",\n \"quantity\",\n \"quoteItemType\",\n \"lineDiscount\",\n \"percentageDiscount\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the quotes table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"quote_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"0645cad1-5749-42f1-9666-eeffac24118b\\\",\\\"message\\\":\\\"Reference value on field: quoteID of quo\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"quote_locations\",\n \"createOp\": \"quote_locations.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"quote_locations.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for quote_locations (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"quotes\",\n \"createOp\": \"quotes.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"effectiveDate\",\n \"expirationDate\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"quotes.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"7db33388-b040-4940-9def-9f4a4b46acb8\\\",\\\"message\\\":\\\"Value does not exist for the required field b\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for quotes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"resource_role_queues\",\n \"createOp\": \"resource_role_queues.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"queueID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 resource_role_queues); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"BLIND SURFACE — own created records invisible to query (node sentinel, ww29-verified)\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for resource_role_queues (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"roles\",\n \"createOp\": \"roles.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"hourlyFactor\",\n \"hourlyRate\",\n \"isActive\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 roles); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"roles.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"roles.delete\\\\\\\" — it is not in the capability registry (l\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for roles (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"service_call_task_resources\",\n \"createOp\": \"service_call_task_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_call_tasks table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_task_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"33baa2f9-f98c-49cd-ac9e-ef1ac532e277\\\",\\\"message\\\":\\\"Value does not exist for\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"service_call_tasks\",\n \"createOp\": \"service_call_tasks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_calls table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_tasks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"49bf54fb-1e7f-40a9-82e0-25c58a4a67fd\\\",\\\"message\\\":\\\"Value does not exist for the requ\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"service_call_ticket_resources\",\n \"createOp\": \"service_call_ticket_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_call_tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_ticket_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"9e96c2d1-9fcb-4d73-95dd-f88c1ce7de6c\\\",\\\"message\\\":\\\"Value does not exist f\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"service_call_tickets\",\n \"createOp\": \"service_call_tickets.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the service_calls table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_call_tickets.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"62ab38e3-b14b-4462-829a-9abc91ce3eb3\\\",\\\"message\\\":\\\"Value does not exist for the re\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"service_calls\",\n \"createOp\": \"service_calls.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"endDateTime\",\n \"startDateTime\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"service_calls.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"27ef068e-2ff8-4bf9-9043-a17008996639\\\",\\\"message\\\":\\\"Value does not exist for the required \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"services\",\n \"createOp\": \"services.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"periodType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"services.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"eb4c0dfd-6d14-4af2-8770-7bd7fc06d0eb\\\",\\\"message\\\":\\\"Picklist value [1] does not exist for perio\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for services (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"subscriptions\",\n \"createOp\": \"subscriptions.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"subscriptionName\",\n \"configurationItemID\",\n \"periodPrice\",\n \"periodType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the configurationItemID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"subscriptions.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"36080c8a-2fd5-4fc3-9c0f-a53d95fa97b2\\\",\\\"message\\\":\\\"Value does not reference an existing e\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"tag_aliases\",\n \"createOp\": \"tag_aliases.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"tag_groups\",\n \"createOp\": \"tag_groups.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"label\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"tags\",\n \"createOp\": \"tags.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"label\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"task_secondary_resources\",\n \"createOp\": \"task_secondary_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"vendor 500: reference rejection on r (exact vendor text preserved verbatim in vendorEvidence — campaign receipt artifact, as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"task_secondary_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"d2783d1d-b23a-4c7d-9459-0089be7f9b0b\\\",\\\"message\\\":\\\"Reference value on field: r\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"tasks\",\n \"createOp\": \"tasks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"projectID\",\n \"taskType\",\n \"status\",\n \"title\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"Value does not reference an existing entity for taskType .\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the taskType reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"taskType\"\n },\n \"vendorEvidence\": [\n \"Value does not reference an existing entity for taskType .\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"tasks.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"4d283916-ab65-46c5-b17b-4eafda10c3ac\\\",\\\"message\\\":\\\"Value does not reference an existing entity fo\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for tasks (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_additional_configuration_items\",\n \"createOp\": \"ticket_additional_configuration_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"configurationItemID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-reference\",\n \"message\": \"vendor 500: the configurationItemID reference is unsatisfiable for this API user (the referenced table is blind/empty)\",\n \"remedy\": \"provision the referenced record in the Autotask UI first (the configurationItemID reference table is blind for this API user — no valid id can be read back), then retry with the real id.\",\n \"referenceField\": \"configurationItemID\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_additional_configuration_items.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"20c78cfe-eb8c-437b-9f41-8a3cd852b05b\\\",\\\"message\\\":\\\"Reference valu\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_additional_contacts\",\n \"createOp\": \"ticket_additional_contacts.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"contactID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"live-PROVEN 2026-10-06 (confirm-100 CONF100-1791187382): id 4001 (deleted post-proof — zero residue). The 10-04 W-A2 'blind reference' was a company-scoping issue, NOT a blind table: 'The contactID is invalid. The contactID must be associated with either the Ticket's Company or its Parent Company.' A contact created under the ticket's own company (30132787 for ticket 527119) passes.\",\n \"remedy\": \"live-proven on ww29 2026-10-06 (confirm-100, marker CONF100-1791187382) — use the proven body / type gates from the message; residue records are ledgered (.run/confirm-100-20261006/CONFIRMATION-LEDGER.md section E; UI cleanup)\"\n },\n \"vendorEvidence\": [\n \"Reference value on field: contactID of type: Contact does not exist or is invalid.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_additional_contacts.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"f507450d-002a-4f1a-afc8-d0168a45f93d\\\",\\\"message\\\":\\\"Reference value on field:\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_attachments\",\n \"createOp\": \"ticket_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"Picklist value [File] does not exist for Type.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"077617d5-48c2-4ca2-a610-8bd1e0da97d4\\\",\\\"message\\\":\\\"Field 'Type': Missing Required Fi\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Picklist value [0] does not exist for Publish. / Field 'Type': Missing Required Field: Type.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_change_request_approvals\",\n \"createOp\": \"ticket_change_request_approvals.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_change_request_approvals.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"dcc063e9-eaf1-4e66-9bc9-cb5c4a4f3f71\\\",\\\"message\\\":\\\"The Ticket id you ha\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_charges\",\n \"createOp\": \"ticket_charges.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"unitQuantity\",\n \"datePurchased\",\n \"chargeType\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"blind-parent\",\n \"message\": \"vendor 500 (stage-11 apply-matrix, marker FULL100W-1791110339): the create consumed the vendor field ladder and then failed on the parent reference — the parent table is blind (0 rows) for this API user, so no valid parent id exists to satisfy it (W-A6). The exact final vendor response is preserved verbatim in vendorEvidence (campaign receipt artifact, as recorded on disk).\",\n \"remedy\": \"provision a parent record in the Autotask UI first — the tickets table is blind (0 rows) for this API user (W-A6), so no valid parent id can be read back; then retry the create with the real parent id.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_charges.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"b9b6939b-ccc5-4e9d-9ea2-e2f47d064f63\\\",\\\"message\\\":\\\"A productID or a billingCodeID must b\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_checklist_items\",\n \"createOp\": \"ticket_checklist_items.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"itemName\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the record was cleaned (NOT_FOUND-verified)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"verified-gone=True\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_checklist_libraries\",\n \"createOp\": \"ticket_checklist_libraries.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"checklistLibraryID\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"W-A7 drift + parent wall, re-verified 2026-10-06 (confirm-100 CONF100-1791187382): the vendor now answers HTML 404 ('Resource not found' — typed NOT_FOUND by the node) for checklistLibraryID=1: the checklist-library PARENT is blind/absent for this API user before the 10-04 200-shape drift can surface. The responseDrift pin remains for the post-parent shape.\",\n \"remedy\": \"the checklist-library PARENT is blind for this user (HTML 404 before the 200 drift) — provision the library in the Autotask UI or use a user where the table is visible; the post-parent 200-shape drift (W-A7) still needs the vendor-side fix\"\n },\n \"vendorEvidence\": [\n \"Expected OperationResultModel { itemId } (or { id }); got a different shape (ladder_decode.log, INVALID_RESPONSE)\",\n \"api-docs.json declares OperationResultModel for POST /V1.0/Tickets/{id}/TicketChecklistLibraries — the vendor deviates (W-A7 adjudication: vendor spec drift, not a node defect)\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Resource not found: <!DOCTYPE html PUBLIC .../xhtml/1.0/Strict ...>\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for ticket_checklist_libraries (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_note_attachments\",\n \"createOp\": \"ticket_note_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_note_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"52976761-8459-49af-8509-49e562e59dbb\\\",\\\"message\\\":\\\"Field 'Type': Missing Requir\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_note_webhooks\",\n \"createOp\": \"ticket_note_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_note_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_notes\",\n \"createOp\": \"ticket_notes.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"description\",\n \"noteType\",\n \"publish\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_notes.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for ticket_notes (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_secondary_resources\",\n \"createOp\": \"ticket_secondary_resources.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"unknown\",\n \"message\": \"create refused (stage-11 apply-matrix, marker FULL100W-1791110339): the final vendor response is preserved verbatim in vendorEvidence (the campaign artifact; its 300-char detail truncation is as recorded on disk)\",\n \"remedy\": \"the wall is opaque in the campaign record — inspect vendorEvidence for the exact vendor text, re-run the create with a live probe (dry-run first), and adjudicate against the vendored spec before retrying.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"ticket_secondary_resources.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"0965b007-8bd2-4d51-9967-257ab506a87a\\\",\\\"message\\\":\\\"Value does not exist for \"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"ticket_webhooks\",\n \"createOp\": \"ticket_webhooks.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"isActive\",\n \"webhookUrl\",\n \"deactivationUrl\",\n \"sendThresholdExceededNotification\",\n \"secretKey\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"ok\",\n \"message\": \"create succeeded live in the stage-11 apply-matrix (marker FULL100W-1791110339, ww29): the vendor accepted the create with the proven field set below; the create response exposed no id (blind surface — the record is marker-tagged residue, unknown id)\",\n \"remedy\": \"none — create with the proven field set below; it is the live-verified contract for this tenant.\"\n },\n \"vendorEvidence\": [\n \"Executed \\\"ticket_webhooks.create\\\".\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"tickets\",\n \"createOp\": \"tickets.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [\n \"title\",\n \"status\",\n \"priority\",\n \"companyID\",\n \"queueID\"\n ],\n \"unproven\": false,\n \"blocker\": {\n \"kind\": \"delete-absent\",\n \"message\": \"create succeeded live (stage-11 apply-matrix, marker FULL100W-1791110339, ww29) but the vendor defines no DELETE endpoint for this resource (W-A1) — the record is residue (marker name FULL100W-1791110339 tickets); cleanup is UI-only.\",\n \"remedy\": \"provision via the API as proven; clean up the residue record in the Autotask UI (the marker name is the lookup handle) — there is no API delete path.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"CONFIG_ERROR\\\",\\\"category\\\":\\\"validation\\\",\\\"retryable\\\":false,\\\"operation\\\":\\\"tickets.delete\\\",\\\"message\\\":\\\"invoke: unknown operation \\\\\\\"tickets.delete\\\\\\\" — it is not in the capability registr\"\n ],\n \"deleteBoundary\": {\n \"available\": false,\n \"note\": \"the vendor defines no DELETE for tickets (spec-derived: the vendored api-docs.json defines no DELETE on the entity's paths) — a create cannot be undone through the API; cleanup is UI-only.\"\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"time_entries\",\n \"createOp\": \"time_entries.create\",\n \"parentScoped\": false,\n \"liveProvenPrefix\": [],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"resource-role-pair\",\n \"message\": \"re-walled 2026-10-06 (confirm-100 CONF100-1791187382, 3 live attempts with own resource 31131505 + roles 29685291/29682834/29683323): current vendor text 'API-only user cannot be selected for this field' (10-04: 'The specified AssignedResourceID and AssignedRoleID combination is not currently defined'). UNSATISFIABLE for this API-only user (resources table blind; own API-only resource refused by the vendor). createForResource (stage-11 proven) is walled by the same drift. Valid in-tenant pairs observed via postedWithin: (31131373, 29682834), (29869529, 29682834) — human resources the API user cannot select.\",\n \"remedy\": \"vendor eligibility, not missing tenant data: an API-only user can never be the selectable resource. Use a non-API-only (human) API user or record time entries in the Autotask UI; the working reads remain postedWithin / the window helpers (W-D3 pointer note)\"\n },\n \"vendorEvidence\": [\n \"The specified AssignedResourceID and AssignedRoleID combination is not currently defined.\",\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"time_entries.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"c5ff4e59-bc8f-4f88-ad05-6445d8fddfa6\\\",\\\"message\\\":\\\"API-only user cannot be selected for th\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"API-only user cannot be selected for this field.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n },\n {\n \"resource\": \"time_entry_attachments\",\n \"createOp\": \"time_entry_attachments.create\",\n \"parentScoped\": true,\n \"liveProvenPrefix\": [\n \"FullPath\",\n \"Type\",\n \"Publish\"\n ],\n \"unproven\": true,\n \"blocker\": {\n \"kind\": \"picklist-unexposed\",\n \"message\": \"re-verified 2026-10-06 (confirm-100 CONF100-1791187382; drift): the vendor validates Publish FIRST ('Picklist value [0] does not exist for Publish'); with a picklist-valid Publish the string Type values File/Document/Image/Other are SILENTLY rejected — 'Field Type: Missing Required Field: Type' (10-04 text: 'Picklist value [File] does not exist for Type'). The Type picklist values remain unexposed to this API user (W-A4) — VENDOR-FIX required.\",\n \"remedy\": \"no valid Type value is exposed to this API user (W-A4: File/Document/Image/Other all rejected) — the attachment create is unsatisfiable via the API; attach the file through the UI.\"\n },\n \"vendorEvidence\": [\n \"{\\\"error\\\":true,\\\"code\\\":\\\"SERVER_ERROR\\\",\\\"category\\\":\\\"server\\\",\\\"retryable\\\":true,\\\"httpStatus\\\":500,\\\"operation\\\":\\\"time_entry_attachments.create\\\",\\\"suggestedAction\\\":\\\"Retry with backoff; the server error is transient.\\\",\\\"correlationId\\\":\\\"04f16a9b-daa6-4dc1-96a2-32508985ac71\\\",\\\"message\\\":\\\"Field 'Type': Missing Require\",\n \"{\\\"live\\\": \\\"2026-10-06 confirm-100\\\", \\\"message\\\": \\\"Picklist value [0] does not exist for Publish. / Field 'Type': Missing Required Field: Type.\\\"}\"\n ],\n \"deleteBoundary\": {\n \"available\": true,\n \"note\": null\n },\n \"zone\": \"ww29\"\n }\n ],\n \"counts\": {\n \"total\": 92,\n \"byKind\": {\n \"ok\": 31,\n \"blind-reference\": 16,\n \"blind-parent\": 17,\n \"picklist-unexposed\": 5,\n \"undocumented-ladder\": 1,\n \"resource-role-pair\": 2,\n \"delete-absent\": 7,\n \"non-mutable\": 0,\n \"unknown\": 13\n }\n }\n};\n\n/**\n * Issue #61 (slice A): the per-resource untrusted-class free-text field\n * SET (the plan's untrustedFields column — the SAME shared derivation as\n * the registry's metadata.untrustedFields channel: plain-string model\n * fields minus the checked exclusions, plus the UDF slots of the\n * udfCapable resources). The queryBounded noteChars cap\n * (src/resources/base.ts) truncates exactly these fields at result-build,\n * BEFORE the server-side untrusted wrapper; response-side only — zero wire.\n * Absent resource = the model has no untrusted-class fields (the cap is a\n * no-op). Zero wire by construction (served plan data).\n */\nexport const UNTRUSTED_FIELDS_BY_RESOURCE: Record<string, readonly string[]> = {\n \"appointments\": [\n \"description\",\n \"title\"\n ],\n \"billing_codes\": [\n \"description\",\n \"name\"\n ],\n \"billing_items\": [\n \"description\",\n \"itemName\",\n \"lineItemFullDescription\",\n \"lineItemGroupDescription\"\n ],\n \"checklist_libraries\": [\n \"description\",\n \"name\"\n ],\n \"checklist_library_checklist_items\": [\n \"itemName\"\n ],\n \"classification_icons\": [\n \"description\",\n \"name\"\n ],\n \"companies\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"billToAttention\",\n \"companyName\",\n \"stockMarket\",\n \"stockSymbol\"\n ],\n \"company_alerts\": [\n \"alertText\"\n ],\n \"company_locations\": [\n \"description\",\n \"name\"\n ],\n \"company_notes\": [\n \"name\",\n \"note\"\n ],\n \"company_site_configurations\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"locationName\"\n ],\n \"company_webhooks\": [\n \"name\"\n ],\n \"configuration_item_categories\": [\n \"name\",\n \"nickname\"\n ],\n \"configuration_item_dns_records\": [\n \"data\",\n \"dnsType\"\n ],\n \"configuration_item_notes\": [\n \"description\",\n \"title\"\n ],\n \"configuration_item_ssl_subject_alternative_names\": [\n \"name\"\n ],\n \"configuration_item_types\": [\n \"name\"\n ],\n \"configuration_item_webhooks\": [\n \"name\"\n ],\n \"configuration_items\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"location\",\n \"notes\",\n \"referenceTitle\"\n ],\n \"contact_groups\": [\n \"name\"\n ],\n \"contact_webhooks\": [\n \"name\"\n ],\n \"contacts\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"firstName\",\n \"lastName\",\n \"middleInitial\",\n \"note\",\n \"title\"\n ],\n \"contract_billing_rules\": [\n \"invoiceDescription\"\n ],\n \"contract_charges\": [\n \"description\",\n \"name\",\n \"notes\"\n ],\n \"contract_exclusion_sets\": [\n \"description\",\n \"name\"\n ],\n \"contract_milestones\": [\n \"description\",\n \"title\"\n ],\n \"contract_notes\": [\n \"description\",\n \"title\"\n ],\n \"contract_service_bundles\": [\n \"internalDescription\",\n \"invoiceDescription\"\n ],\n \"contract_services\": [\n \"internalDescription\",\n \"invoiceDescription\"\n ],\n \"contracts\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"contactName\",\n \"contractName\",\n \"description\"\n ],\n \"countries\": [\n \"displayName\",\n \"name\"\n ],\n \"departments\": [\n \"description\",\n \"name\"\n ],\n \"domain_registrars\": [\n \"name\"\n ],\n \"expense_item_attachments\": [\n \"title\"\n ],\n \"expense_items\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"destination\",\n \"entertainmentLocation\",\n \"origin\"\n ],\n \"expense_reports\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"name\",\n \"rejectionReason\"\n ],\n \"holiday_sets\": [\n \"holidaySetDescription\",\n \"holidaySetName\"\n ],\n \"holidays\": [\n \"holidayName\"\n ],\n \"invoices\": [\n \"comments\",\n \"taxRegionName\"\n ],\n \"notification_history\": [\n \"entityTitle\",\n \"recipientDisplayName\",\n \"templateName\"\n ],\n \"opportunities\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"barriers\",\n \"description\",\n \"helpNeeded\",\n \"lossReasonDetail\",\n \"market\",\n \"nextStep\",\n \"promotionName\",\n \"revenueSpreadUnit\",\n \"title\",\n \"winReasonDetail\"\n ],\n \"opportunity_attachments\": [\n \"title\"\n ],\n \"opportunity_categories\": [\n \"name\",\n \"nickname\"\n ],\n \"products\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"link\",\n \"manufacturerName\",\n \"manufacturerProductName\",\n \"name\"\n ],\n \"project_charges\": [\n \"description\",\n \"name\",\n \"notes\"\n ],\n \"project_notes\": [\n \"description\",\n \"title\"\n ],\n \"phases\": [\n \"description\",\n \"title\"\n ],\n \"tasks\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"title\"\n ],\n \"projects\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"projectName\",\n \"statusDetail\"\n ],\n \"purchase_approvals\": [\n \"costType\",\n \"rejectNote\"\n ],\n \"purchase_order_items\": [\n \"memo\"\n ],\n \"purchase_orders\": [\n \"generalMemo\",\n \"shipToCity\",\n \"shipToName\",\n \"shipToState\"\n ],\n \"quote_items\": [\n \"description\",\n \"name\"\n ],\n \"quote_templates\": [\n \"description\",\n \"name\"\n ],\n \"quotes\": [\n \"comment\",\n \"description\",\n \"extApprovalResponseSignature\",\n \"name\"\n ],\n \"resource_skills\": [\n \"skillDescription\"\n ],\n \"resources\": [\n \"dateFormat\",\n \"firstName\",\n \"gender\",\n \"initials\",\n \"lastName\",\n \"middleName\",\n \"officeExtension\",\n \"resourceType\",\n \"timeFormat\",\n \"title\",\n \"travelAvailabilityPct\",\n \"userName\"\n ],\n \"roles\": [\n \"description\",\n \"name\"\n ],\n \"service_calls\": [\n \"description\"\n ],\n \"service_level_agreement_results\": [\n \"serviceLevelAgreementName\"\n ],\n \"services\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"invoiceDescription\",\n \"manufacturerServiceProvider\",\n \"name\"\n ],\n \"skills\": [\n \"description\",\n \"name\"\n ],\n \"subscriptions\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"description\",\n \"subscriptionName\"\n ],\n \"surveys\": [\n \"description\",\n \"displayName\",\n \"name\"\n ],\n \"tag_aliases\": [\n \"alias\"\n ],\n \"tag_groups\": [\n \"label\"\n ],\n \"tags\": [\n \"label\"\n ],\n \"ticket_attachments\": [\n \"title\"\n ],\n \"ticket_categories\": [\n \"name\",\n \"nickname\"\n ],\n \"ticket_category_field_defaults\": [\n \"description\",\n \"resolution\",\n \"title\"\n ],\n \"ticket_change_request_approvals\": [\n \"approveRejectNote\"\n ],\n \"ticket_charges\": [\n \"description\",\n \"name\",\n \"notes\"\n ],\n \"ticket_checklist_items\": [\n \"itemName\"\n ],\n \"ticket_history\": [\n \"action\",\n \"detail\"\n ],\n \"ticket_note_attachments\": [\n \"title\"\n ],\n \"ticket_note_webhooks\": [\n \"name\"\n ],\n \"ticket_notes\": [\n \"description\",\n \"title\"\n ],\n \"ticket_webhooks\": [\n \"name\"\n ],\n \"tickets\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"changeInfoField1\",\n \"changeInfoField2\",\n \"changeInfoField3\",\n \"changeInfoField4\",\n \"changeInfoField5\",\n \"description\",\n \"resolution\",\n \"title\"\n ],\n \"time_entries\": [\n \"UDF1\",\n \"UDF10\",\n \"UDF11\",\n \"UDF12\",\n \"UDF13\",\n \"UDF14\",\n \"UDF15\",\n \"UDF16\",\n \"UDF17\",\n \"UDF18\",\n \"UDF19\",\n \"UDF2\",\n \"UDF20\",\n \"UDF3\",\n \"UDF4\",\n \"UDF5\",\n \"UDF6\",\n \"UDF7\",\n \"UDF8\",\n \"UDF9\",\n \"internalNotes\",\n \"summaryNotes\"\n ],\n \"time_entry_attachments\": [\n \"title\"\n ],\n \"time_off_requests\": [\n \"reason\",\n \"rejectReason\"\n ],\n \"inventory_products\": [\n \"bin\"\n ]\n} as Record<string, readonly string[]>;\n// [GENERATED:RELATIONSHIPS:END]\n","/**\n * Pagination — cursor-follow walk (ARCHITECTURE section 7).\n *\n * The walk follows the vendor's `pageDetails.nextPageUrl` cursor, node-style\n * (the node's `helpers/pagination.ts` does the same): the fetcher is\n * `BaseResource.fetchPage`, which POSTs the QueryModel body for page 1 and\n * the preserved filter to the ABSOLUTE cursor for later pages (same-origin\n * cursors are used verbatim; cross-origin ones are re-based onto the client\n * base URL — the node's custom-zone behaviour). `hasMore` is\n * `nextPageUrl !== null`; the walk also stops on a short/empty page, guarded\n * by the 1000-page cap (`MAX_PAGES` — the node runtime constant,\n * `PAGINATION.MAX_PAGES` = 1000; a stale \"50\" exists in the node's\n * `constants/operations.ts` but is unreferenced) — a walk that would fetch a\n * 1001st page throws `PaginationLimitError` (code PAGINATION_LIMIT,\n * category policy, non-retryable). Filtering stays a server-side concern:\n * the SDK never post-filters client-side.\n */\nimport { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE } from './config.js';\nimport { PaginationLimitError } from './errors.js';\nimport type { Page } from './types/common.js';\n\n/** Re-export for the barrel (canonical definition: types/common.ts). */\nexport type { Page } from './types/common.js';\n\n/** A page fetcher: request page N at the given size; report paging facts from `pageDetails`. */\nexport type PageFetcher<T> = (page: number, pageSize: number) => Promise<Page<T>>;\n\n/** 1000-page walk guard (the node's `MAX_PAGES`). */\nexport const MAX_PAGES = 1000;\n\nexport interface PaginateOptions {\n /** Page size for the walk. Default 10; clamped into 1..500. */\n pageSize?: number;\n /**\n * `collectAll` only: refuse to accumulate more than this many records.\n * Exceeding it throws `PaginationLimitError` (never a silent truncation).\n * Default: unbounded (the 1000-page walk guard still applies).\n */\n maxRecords?: number;\n}\n\n/** Clamp a requested page size into the vendor range 1..500. */\nexport function clampPageSize(pageSize: number): number {\n const n = Math.floor(pageSize);\n return Math.min(Math.max(Number.isNaN(n) ? 1 : n, 1), MAX_PAGE_SIZE);\n}\n\n/**\n * `ceil(total / pageSize)`; 0 for an empty result set. `total` must be a TRUE\n * match count (`count()`, POST .../query/count) — never `pageDetails.requestCount`,\n * which echoes the requested MaxRecords.\n */\nexport function totalPagesFor(total: number, pageSize: number): number {\n if (total <= 0) return 0;\n return Math.ceil(total / clampPageSize(pageSize));\n}\n\n/**\n * Yield pages one at a time until the walk ends. Requests pages 1, 2, 3, ...\n * at `clampPageSize(opts.pageSize ?? 10)`; a walk that would fetch a 1001st\n * page throws `PaginationLimitError` before issuing the request.\n */\nexport async function* paginate<T>(\n fetchPage: PageFetcher<T>,\n opts: PaginateOptions = {},\n): AsyncGenerator<Page<T>, void> {\n const pageSize = clampPageSize(opts.pageSize ?? DEFAULT_PAGE_SIZE);\n let page = 1;\n for (;;) {\n if (page > MAX_PAGES) {\n throw new PaginationLimitError(\n `Pagination exceeded ${MAX_PAGES} pages; refusing to fetch page ${page} (possible runaway walk)`,\n );\n }\n const p = await fetchPage(page, pageSize);\n yield p;\n if (!p.hasMore || p.items.length === 0) return;\n page += 1;\n }\n}\n\n/** Yield items across pages (flattened). */\nexport async function* paginateItems<T>(\n fetchPage: PageFetcher<T>,\n opts: PaginateOptions = {},\n): AsyncGenerator<T, void> {\n for await (const page of paginate(fetchPage, opts)) {\n for (const item of page.items) yield item;\n }\n}\n\n/** Collect every item across all pages into one array (`queryAll`'s workhorse). */\nexport async function collectAll<T>(fetchPage: PageFetcher<T>, opts: PaginateOptions = {}): Promise<T[]> {\n const all: T[] = [];\n const cap = opts.maxRecords;\n for await (const page of paginate(fetchPage, opts)) {\n all.push(...page.items);\n if (cap !== undefined && all.length > cap) {\n throw new PaginationLimitError(\n `Collected more than maxRecords (${cap}) records; refusing to accumulate further`,\n { suggestedAction: 'Narrow the query with a tighter filter, or raise maxRecords.' },\n );\n }\n }\n return all;\n}\n\n/** Materialise an async iterator of items into an array. */\nexport async function toArray<T>(iter: AsyncIterable<T>): Promise<T[]> {\n const out: T[] = [];\n for await (const item of iter) out.push(item);\n return out;\n}\n","/**\n * Field presets — the CLOSED includeFields preset list (issue #61, slice B).\n *\n * A preset is a named, hand-curated `includeFields` list for ONE plan\n * resource (the issue's \"common narrow reads\" — v1 ships `billing_join`,\n * the billing-item join columns). The list is CLOSED and HAND-AUTHORED\n * (a curation choice, NOT a spec derivation — same class as\n * n8n-mcp.curation.json): the vendored spec's model set is a cheap\n * NON-AUTHORITATIVE guard (a field may be live-only, e.g. the\n * time_entries.postedDate class), and the LIVE field catalogue is the\n * oracle — the live-smoke preset check asserts every preset field exists\n * on the live resource (scripts/live-smoke.mjs; docs/API.md §11.23).\n *\n * Resolution is PRE-WALK (zero extra wire): `fieldsPreset: 'billing_join'`\n * on `billing_items.query` BECOMES the walk's `includeFields` (the vendor's\n * own column selection rides the existing IncludeFields wire path; `id`\n * is always appended by the P1 id-append — no new wire mechanics). The\n * refusals are pre-request typed errors (zero wire, the closed-bag\n * discipline): unknown preset name (the valid names are named),\n * preset/resource mismatch (the preset and its resource are named), and\n * `fieldsPreset` + an explicit `includeFields` (both are named — no silent\n * precedence; an ambiguous bag is the typo class the closed bags refuse).\n *\n * Adding a preset later is one module entry + one docs line + one\n * live-check line (no schema/registry change — the preset is not\n * plan-derived). Public-safe: the field names are the vendor's public\n * model vocabulary (the same as MODEL_FIELD_SETS); no tenant/client data.\n */\nimport { AutotaskConfigError } from './errors.js';\n\n/** One includeFields preset (a closed-list entry). */\nexport interface FieldsPreset {\n /** The plan resource key the preset resolves on (a mismatch refuses pre-request). */\n resource: string;\n /** The preset's field list (the vendor field names; non-empty, deduped). */\n fields: readonly string[];\n}\n\n/** The CLOSED preset list (v1 = the one preset the issue names). */\nexport const FIELD_PRESETS: Readonly<Record<string, FieldsPreset>> = {\n /**\n * The billing-item join read (the issue's example): the FK + measure\n * columns that join a billing item to its company / ticket / project /\n * time entry / contract service / contract / billing code / expense item,\n * plus the date and the amount fields. All 14 names verified against the\n * vendored-spec billing_items model (the non-authoritative guard); LIVE\n * existence is asserted by the live-smoke preset check (the AC test).\n */\n billing_join: {\n resource: 'billing_items',\n fields: [\n 'companyID',\n 'ticketID',\n 'projectID',\n 'timeEntryID',\n 'contractServiceID',\n 'contractID',\n 'billingCodeID',\n 'expenseItemID',\n 'itemDate',\n 'quantity',\n 'rate',\n 'extendedPrice',\n 'totalAmount',\n 'nonBillable',\n ],\n },\n};\n\n/** The valid preset names (the closed set the refusal text names). */\nexport const FIELD_PRESET_NAMES: readonly string[] = Object.keys(FIELD_PRESETS);\n\n/**\n * Resolve a preset name to its field list for the calling resource\n * (pre-request, zero wire). The I8 refusal classes (typed, zero wire):\n * - `fieldsPreset` + an explicit `includeFields` both present → refusal\n * naming both (no silent precedence — checked FIRST, so the ambiguity\n * is refused even when the name is unknown);\n * - unknown preset name → the valid preset names are named (the\n * closed-set discipline, the `invoke` unknown-key pattern);\n * - the preset's resource != the calling resource → the preset and its\n * resource are named.\n * Returns a FRESH copy (the caller may mutate it — `id` is appended later\n * by the wire layer, never into the preset).\n */\nexport function resolveFieldsPreset(\n name: string,\n resourceKey: string,\n explicitIncludeFields?: readonly string[] | null,\n): string[] {\n if (explicitIncludeFields !== undefined && explicitIncludeFields !== null && explicitIncludeFields.length > 0) {\n throw new AutotaskConfigError(\n `fieldsPreset: \"${name}\" cannot be combined with an explicit includeFields — the bag is closed (pass ONE of the two: the preset name OR the field list)`,\n );\n }\n const preset = Object.hasOwn(FIELD_PRESETS, name) ? FIELD_PRESETS[name] : undefined;\n if (preset === undefined) {\n throw new AutotaskConfigError(\n `fieldsPreset: unknown preset \"${name}\" — the preset list is closed (valid names: ${FIELD_PRESET_NAMES.join(', ')})`,\n );\n }\n if (preset.resource !== resourceKey) {\n throw new AutotaskConfigError(\n `fieldsPreset: \"${name}\" is a ${preset.resource} preset — it cannot be resolved on ${resourceKey} (the preset names its resource; the valid names are: ${FIELD_PRESET_NAMES.join(', ')})`,\n );\n }\n return [...preset.fields];\n}\n","/**\n * `operations.expandResourceNames` — opt-in resource name expansion\n * (issue #65).\n *\n * Given vendor numeric resource ids (the `resourceID` values other\n * tables expose WITHOUT names — time_entries / billing_items / tickets),\n * resolve each to a display name in ONE call. The op is the dedicated\n * equivalent of the issue's `expand: ['resource']` bag key (the\n * \"(or equivalent)\" reading, grounded): a bag key on the query family\n * would change the shared `query` primitive (~116 ops) and collide with\n * the established `expand?: boolean` `resolve` opt — a dedicated op is\n * the house shape for cross-resource helpers (ARCHITECTURE 19.1: they\n * live in `src/operations/`).\n *\n * Pinned semantics:\n * - ids are vendor numeric resource ids (safe integers) or their\n * canonical integer STRING form (ids above 2^53 — the exact digits\n * ride the wire URL verbatim); a NON-NUMERIC string identifier is\n * `resolveAny`/`resources.resolve` territory — refused PRE-REQUEST\n * pointing at `autotask_resolve_any` (the house identifier contract,\n * the complete problem list in one message, zero wire);\n * - cap {@link EXPAND_RESOURCE_NAMES_MAX_IDS} = 500 per call (mirrors\n * `FETCH_BY_IDS_MAX_ITEMS`; `maxIds` may lower the cap, never raise\n * it; over → `CONFIG_ERROR` pre-request, zero wire);\n * - per-call de-duplication of ids is ALWAYS on (the issue's\n * \"(dedupe ids within a call)\" — each occurrence gets its own row\n * with the identical outcome over one wire fetch);\n * - **NEVER an `id in` query** (AC4 — the issue's explicit\n * prohibition): the resources table's count/query can be BLIND to\n * the API user (the plan-pinned zoneFacts quirk) while per-id reads\n * work — an `id in` lookup on a blind table would silently return\n * nothing. The op's ONLY wire verb is `GET /V1.0/Resources/{id}`\n * (`resources.get`, the authority read) — the module imports NO\n * query builder (the static guarantee; the tests assert METHOD +\n * PATH on every wire call);\n * - per-row outcome `{ id, name, blind, error? }`: `name` = composed\n * `firstName [middleName] lastName` (single spaces; the vendor\n * `Resource` model has NO single name field — `suffix`/`initials`\n * excluded in v1, the raw parts via `operations.fetchByIds` with\n * `fields`); a record FOUND with no name part → `{ name: null,\n * blind: false }` (a vendor data gap — distinct from blind); a\n * per-id miss (HTTP 404 or `200 item: null` — the vendor's TRUE\n * not-found) → `{ name: null, blind: true }`, id kept, NO error, NO\n * throw (AC3 — the invisible-table case: at the per-id level the\n * vendor does not distinguish \"table invisible to this user\" from\n * \"record absent\", so BOTH are blind); a transient typed fault\n * (5xx class) → per-row `error` (REUSED `FetchManyItemError` shape,\n * the fetchByIds precedent) — never cached, never aborting the\n * remaining ids; `ABORTED` / non-SDK faults propagate (swallowing\n * would fake a partial result — the fetchMany rule);\n * - result `{ results (input order, duplicates get identical rows),\n * resolved, blind, failed }`.\n *\n * The name cache (AC2 — \"each distinct id fetched at most once per cache\n * lifetime\"): the `resourceNameCache: { ttlMs, maxEntries? }` channel is\n * default-on (issue #80 — absent = the default instance; `false` = no\n * instance, bit-for-bit the uncached op path), so a repeat id (resolved\n * OR blind — the vendor's true\n * not-found IS cached as the blind marker, the issue-#36 absent-marker\n * precedent: a repeat miss costs no wire) inside the TTL costs zero\n * wire; a failure is never cached (the fault's retry is the house\n * fault-retry contract, not a cache hit). A `resources` write through\n * the same client clears the channel (scoped invalidation); renames\n * made elsewhere show up once `ttlMs` expires (the documented\n * staleness contract). When the ReadCache (`cache`) is ALSO\n * configured, the per-id `get` rides it transparently (double\n * layering, disjoint key spaces — a ReadCache hit inside its TTL costs\n * zero wire and the name is then stored in the name cache). A\n * `fresh: true` call bypasses BOTH caches (issue #77: the per-id GET\n * fetches live and refreshes the ReadCache entry as well as the name\n * entry — a rename made elsewhere is never served stale by the op).\n *\n * Wire cost: `N` unique ids cold = `N` GETs (no POST, no `/query`, no\n * `id in` — AC4 by construction); warm = 0. Typical report (a few\n * dozen distinct resources): N wire once, 0 thereafter within the\n * TTL.\n *\n * It is a READ op: the governor appends no bag (no dry-run/confirm\n * interaction — the same as fetchByIds).\n */\nimport { AutotaskConfigError, isAutotaskError, NotFoundError } from '../errors.js';\nimport type { AutotaskClient } from '../client.js';\nimport type { Identifier } from '../types/common.js';\nimport { parseIdentifier } from '../utils/index.js';\nimport type { FetchManyItemError } from './types.js';\n\n/** The pinned per-call id cap (mirrors `FETCH_BY_IDS_MAX_ITEMS` — the house bulk cap; over → pre-request refusal, zero wire). */\nexport const EXPAND_RESOURCE_NAMES_MAX_IDS = 500;\n\nexport interface ExpandResourceNamesOptions {\n /** May LOWER the {@link EXPAND_RESOURCE_NAMES_MAX_IDS} cap (integer >= 1) — never raise it. */\n maxIds?: number;\n /** Bypass + refresh the NAME cache AND the ReadCache (default false — the name-cache lookup runs unless `resourceNameCache: false`; the per-id `resources.get` otherwise rides the ReadCache when `cache` is configured). With `fresh: true`, the per-id GET fetches live and refreshes BOTH caches — a rename made elsewhere is served on the very next call, never a stale snapshot (issue #77). */\n fresh?: boolean;\n}\n\n/** One per-id outcome (input order; duplicates get identical rows). */\nexport interface ExpandResourceNameRow {\n /** The canonical id as requested (safe integer, or the exact-digit string). */\n id: Identifier;\n /** The composed display name (`firstName [middleName] lastName`,\n * single spaces); null when the vendor returned no name part (a\n * data gap — distinct from blind) or the id is blind. */\n name: string | null;\n /** True when the per-id read is the vendor's true not-found (404 or\n * `200 item: null`) — the table-invisible case: the id is kept, no\n * error, no throw. */\n blind: boolean;\n /** A transient per-id fault (code + httpStatus + message) — present\n * exactly when the id neither resolved nor came back blind; never\n * cached, never aborting the remaining ids. */\n error?: FetchManyItemError;\n}\n\n/** The batch result: one row per input occurrence, in input order. */\nexport interface ExpandResourceNamesResult {\n results: ExpandResourceNameRow[];\n /** Rows with a composed name. */\n resolved: number;\n /** Rows marked blind (the vendor's true not-found). */\n blind: number;\n /** Rows carrying a per-id fault. */\n failed: number;\n}\n\n/** A per-id settled outcome (the cache stores the deterministic subset). */\ninterface Outcome {\n name: string | null;\n blind: boolean;\n error?: FetchManyItemError;\n}\n\n/** Compose the display name: `firstName [middleName] lastName`, filtered\n * to non-empty trimmed parts and joined with single spaces; null when no\n * part is present (a vendor data gap — the vendor model has no single\n * name field). */\nfunction composeName(record: Record<string, unknown>): string | null {\n const parts: string[] = [];\n for (const field of ['firstName', 'middleName', 'lastName']) {\n const value = record[field];\n if (typeof value === 'string' && value.trim() !== '') parts.push(value.trim());\n }\n return parts.length > 0 ? parts.join(' ') : null;\n}\n\n/**\n * Resolve vendor numeric resource ids to display names in ONE opt-in\n * call (per-id `resources.get` reads ONLY — never an `id in` query;\n * blind-marked rows for ids the API user cannot resolve; the opt-in\n * name cache when configured).\n *\n * ```ts\n * import { expandResourceNames } from 'node-autotask/operations';\n * const { results, resolved, blind, failed } = await expandResourceNames(\n * client,\n * [101, 102, '103'],\n * { maxIds: 500, fresh: false },\n * );\n * ```\n */\nexport async function expandResourceNames(\n client: AutotaskClient,\n ids: readonly Identifier[],\n opts: ExpandResourceNamesOptions = {},\n): Promise<ExpandResourceNamesResult> {\n if (opts.maxIds !== undefined && (!Number.isInteger(opts.maxIds) || opts.maxIds < 1)) {\n throw new AutotaskConfigError(`expandResourceNames: maxIds must be an integer >= 1 (got ${String(opts.maxIds)})`);\n }\n const cap = Math.min(EXPAND_RESOURCE_NAMES_MAX_IDS, opts.maxIds ?? EXPAND_RESOURCE_NAMES_MAX_IDS);\n if (!Array.isArray(ids) || ids.length === 0) {\n throw new AutotaskConfigError(\n 'expandResourceNames: ids must be a non-empty array of vendor numeric resource ids (a zero-id call is a shape error, not a no-op)',\n { suggestedAction: 'Pass at least one vendor numeric resource id — safe integer, or the canonical integer string for ids above 2^53.' },\n );\n }\n if (ids.length > cap) {\n throw new AutotaskConfigError(\n `expandResourceNames: ${ids.length} ids over the ${cap}-id cap (EXPAND_RESOURCE_NAMES_MAX_IDS = ${EXPAND_RESOURCE_NAMES_MAX_IDS}; maxIds may lower, never raise) — zero ids were fetched (pre-request)`,\n { suggestedAction: `Split the call into groups of <= ${cap} ids.`, },\n );\n }\n // The identifier contract (the fetchMany taxonomy, re-used with the\n // calling op named): safe numbers pass, canonical integer strings pass\n // with their exact digits, everything else is refused — the COMPLETE\n // problem list in one message, zero wire.\n const problems: string[] = [];\n const canonical: Identifier[] = [];\n for (let i = 0; i < ids.length; i += 1) {\n const at = `ids[${i}]`;\n const raw = ids[i]!;\n try {\n canonical[i] = parseIdentifier(raw, at);\n } catch {\n if (typeof raw === 'string') {\n problems.push(`${at}: \"${raw}\" is not a vendor numeric resource id — non-numeric string identifiers are autotask_resolve_any territory (resolveAny / the resource's findBy* helpers)`);\n } else if (typeof raw === 'number') {\n problems.push(`${at}: ${raw} is not a non-negative safe integer (a JS number this large is already corrupted — pass the canonical integer string form)`);\n } else {\n problems.push(`${at}: required — the vendor numeric resource id (safe integer, or the canonical integer string for ids above 2^53)`);\n }\n }\n }\n if (problems.length > 0) {\n throw new AutotaskConfigError(`expandResourceNames: ${problems.length} problem(s) found pre-request (zero wire was issued)\\n- ` + problems.join('\\n- '), {\n suggestedAction: 'Fix every id above and call again — the ids are vendor NUMERIC resource ids only (name-to-id resolution is autotask_resolve_any territory).',\n });\n }\n // Per-call de-duplication (always on): canonical ids, first-occurrence\n // order — duplicates ride ONE wire fetch (each occurrence still gets\n // its own row below).\n const unique: Identifier[] = [];\n const seen = new Set<string>();\n for (const id of canonical) {\n const k = String(id);\n if (!seen.has(k)) {\n seen.add(k);\n unique.push(id);\n }\n }\n\n // The per-id wire shape: `resources.get` (the item envelope; item:\n // null → NotFoundError). The holder rides the ReadCache when `cache`\n // is configured (the documented layering — the name cache stores the\n // projection, the ReadCache stores the record); `fresh: true` passes\n // through and bypasses the ReadCache too (the fresh read still\n // refreshes the entry — issue #77).\n const holder = client.resources;\n const cache = client.http.resourceNameCache;\n const fresh = opts.fresh === true;\n\n const byId = new Map<string, Outcome>();\n for (const id of unique) {\n const k = String(id);\n // The lookup (bypassed by `fresh`): a live in-flight read settles\n // shared; a live entry costs zero wire.\n if (cache !== undefined && !fresh) {\n const shared = cache.inflight(id);\n if (shared !== undefined) {\n // Another caller's read may reject with ITS abort: that is not ours —\n // fall through and issue our own read.\n let joined: Outcome | undefined;\n try {\n joined = (await shared) as Outcome;\n } catch (err) {\n if (!isAutotaskError(err) || err.code !== 'ABORTED') throw err;\n }\n if (joined !== undefined) {\n byId.set(k, joined);\n continue;\n }\n }\n const hit = cache.get(id);\n if (hit !== undefined) {\n byId.set(k, { name: hit.name, blind: hit.blind });\n continue;\n }\n }\n // MISS — ONE per-id GET. The store happens INSIDE the tracked work so\n // a concurrent joiner sees the settled value, not a re-fetch;\n // failures are NEVER cached (the fault rejects/resolves before any\n // `set` can run).\n const epoch = cache?.epoch ?? 0;\n const work = (async (): Promise<Outcome> => {\n try {\n const record = (await holder.get(id, { fresh })) as unknown as Record<string, unknown>;\n const name = composeName(record);\n // An unnamed record (no name part) is not pinned: a transient partial\n // record must not stick for the whole TTL.\n if (cache !== undefined && name !== null) cache.set(id, { name, blind: false }, epoch);\n return { name, blind: false };\n } catch (err) {\n if (err instanceof NotFoundError) {\n // The vendor's TRUE not-found (404 or `200 item: null`): the\n // table-invisible case — blind, id kept, NO error, NO throw.\n // The marker IS cached (the issue-#36 absent-marker precedent):\n // a repeat miss costs no wire.\n const entry = { name: null, blind: true };\n if (cache !== undefined) cache.set(id, entry, epoch);\n return { name: null, blind: true };\n }\n if (isAutotaskError(err) && err.code !== 'ABORTED') {\n // A transient typed fault (5xx class): a per-row error — never\n // cached, never aborting the remaining ids.\n const e: FetchManyItemError = { code: err.code, message: err.message };\n if (err.httpStatus !== undefined) e.httpStatus = err.httpStatus;\n return { name: null, blind: false, error: e };\n }\n // Not an item-level vendor outcome (an abort, or a non-SDK\n // fault): propagate — swallowing it would fake a partial result\n // (the fetchMany rule).\n throw err;\n }\n })();\n const settled = cache !== undefined ? (await cache.track(id, work)) : (await work);\n byId.set(k, settled as Outcome);\n }\n\n // Re-merge to INPUT order — every occurrence (incl. duplicates) gets\n // its own row with the identical outcome.\n const results: ExpandResourceNameRow[] = [];\n for (const id of canonical) {\n const out = byId.get(String(id))!; // every canonical id settled: hit / blind / fault\n results.push({ id, name: out.name, blind: out.blind, ...(out.error !== undefined ? { error: out.error } : {}) });\n }\n const resolved = results.filter((r) => r.name !== null).length;\n const blind = results.filter((r) => r.blind === true).length;\n const failed = results.filter((r) => r.error !== undefined).length;\n return { results, resolved, blind, failed };\n}\n","/**\n * Cross-resource operations layer — shared types (ARCHITECTURE section 19.1,\n * 19.5). The operations layer is MCP-independent: plain SDK code, no MCP\n * imports, no schema-library dependency.\n *\n * The default resource set for the cross-resource helpers is the FIVE\n * workflow resources (plan `workflowResource: true`) — the core tier an\n * agent starting from a bare value or a free-text query needs first\n * (section 19.5 R3).\n */\n\nimport type { Identifier } from '../types/common.js';\n\n/** The five workflow resources (plan keys), in core-tier order. */\nexport const WORKFLOW_RESOURCES: readonly string[] = [\n 'companies',\n 'tickets',\n 'contacts',\n 'configuration_items',\n 'projects',\n];\n\n// ---------------------------------------------------------------------------\n// searchAcrossResources\n// ---------------------------------------------------------------------------\n\nexport interface SearchAcrossResourcesOptions {\n /** Resource keys to search (default: the five workflow resources). */\n resources?: readonly string[];\n /** Max matches per resource (default 25, max 500). */\n limit?: number;\n}\n\n/** One searched resource's matches (compact shapes; `Summary = full record`). */\nexport interface SearchAcrossResourcesRow {\n resource: string;\n matches: Array<Record<string, unknown>>;\n}\n\nexport interface SearchAcrossResourcesResult {\n /** The trimmed query that was run. */\n query: string;\n /** One row per resource that HAS a `search` helper, in request order. */\n results: SearchAcrossResourcesRow[];\n /** Requested keys without a `search` helper — skipped and reported, never errored. */\n skipped: string[];\n}\n\n// ---------------------------------------------------------------------------\n// fetchMany (the batch/fan-out read primitive — S12-B, run mcp-fix-20261003)\n// ---------------------------------------------------------------------------\n\n/** One fetchMany item: a single-record GET by vendor numeric id. */\nexport interface FetchManyItem {\n /** The plan resource key (snake_case, e.g. `tickets`) — top-level resources only. */\n resource: string;\n /** The vendor numeric id: a safe integer, or the canonical integer string for ids above 2^53 (non-numeric string identifiers are `resolveAny` territory — refused pre-request). */\n id: Identifier;\n /** Client-side PROJECTION of the fetched record (exact vendor field names; unknown keys are refused pre-request — the vendor single-record GET has no field selection, projection is post-fetch, zero extra wire). */\n fields?: string[];\n}\n\n/** One per-item fault (partial failures are typed PER ITEM — never all-or-nothing). */\nexport interface FetchManyItemError {\n /** The typed error code: `NOT_FOUND` (vendor 404/empty item) or `SERVER_ERROR` (5xx) are the pinned item codes; other real faults carry their typed `AutotaskError` code (e.g. `RATE_LIMITED`). */\n code: string;\n /** The vendor HTTP status when the fault is an HTTP error. */\n httpStatus?: number;\n /** The fault message (redaction-safe: never carries request/response bodies). */\n message: string;\n}\n\n/** One item's outcome — `value` is the record (projected when `fields` was given); `error` is present exactly when `found` is false. */\nexport interface FetchManyItemResult {\n resource: string;\n /** The canonical id as requested (safe integer, or the exact-digit string). */\n id: Identifier;\n found: boolean;\n value: Record<string, unknown> | null;\n error?: FetchManyItemError;\n}\n\n/** The batch result: one row per item, in input order. */\nexport interface FetchManyResult {\n results: FetchManyItemResult[];\n /** Items that returned a record. */\n ok: number;\n /** Items that missed or faulted (typed per item). */\n failed: number;\n}\n\n// ---------------------------------------------------------------------------\n// resolveAny\n// ---------------------------------------------------------------------------\n\nexport interface ResolveAnyOptions {\n /** Resource keys to resolve against (default: the five workflow resources). */\n resources?: readonly string[];\n}\n\n/**\n * One resource's outcome. Unlike single-resource `resolve`, a miss does NOT\n * throw — the `error` code is reported and `value` stays null.\n */\nexport interface ResolveAnyResourceOutcome {\n resource: string;\n /** The compact record when resolved; null on a miss/error. */\n value: Record<string, unknown> | null;\n /** How the match was found (or what was attempted). */\n resolutionCost: 'direct' | 'server-filter' | 'client-scan';\n /** Records read by the bounded client-scan fallback. */\n scanned: number;\n /** True when the scan hit its cap (a complete non-match is unproven). */\n scanTruncated: boolean;\n /** Candidate ids when the resource matched more than one record. */\n candidates: (number | string)[];\n /** Error code when the resource could not resolve (e.g. `NOT_FOUND`, `CONFIG_ERROR`). */\n error?: string;\n}\n\nexport interface ResolveAnyResult {\n identifier: number | string;\n /** One outcome per requested resource, in request order. */\n results: ResolveAnyResourceOutcome[];\n /** The resources that resolved to exactly one record. */\n matches: string[];\n}\n\n// ---------------------------------------------------------------------------\n// invoke (the write governor, section 19.5 R2–R4)\n// ---------------------------------------------------------------------------\n\n/**\n * Caller options for `invoke`. The dry-run flag lives HERE, never in the\n * payload.\n */\nexport interface InvokeOptions {\n /**\n * Writes are DRY-RUN-FIRST: omit this (or pass `true`) and the operation\n * runs on the SDK's dry-run path — the real mutating request is never\n * issued and the result is a `DryRunResult` with `simulated: true`. Only\n * an explicit `dryRun: false` executes a write. A read REFUSES `dryRun:\n * true` (a read has no dry run to run).\n */\n dryRun?: boolean;\n /**\n * Deliberate-act acknowledgement: REQUIRED for a destructive or\n * approval-gated operation and must EQUAL the operation key exactly (no\n * fuzzy matching, no booleans) — e.g. `confirm: 'companies.delete'`.\n */\n confirm?: string;\n /**\n * The caller-observed `lastModifiedDate` (stale-object guard, section\n * 19.3) — passed through to the mutation's `MutationOpts`.\n */\n lastModifiedDate?: string;\n}\n","/**\n * `operations.fieldCatalog` — the opt-in LIVE field-metadata channel\n * (issue #31).\n *\n * Fetches the vendor's field catalog on demand: one bounded\n * entityInformation GET per named resource × included kind (`fields` by\n * default), hard-capped (REFUSED, never truncated — the\n * `probeReachability` contract applied to a small fan-out), with\n * per-resource failure isolation (one vendor 500 is recorded on the row\n * and the sweep continues). With the opt-in `fieldCache` configured, the\n * reads go through the shared FieldCache (TTL + in-flight de-dup + drift\n * invalidation); without it the wire path is the plain uncached trio.\n *\n * Capability is PLAN-DERIVED, never hardcoded: which resources carry a\n * field catalog (`getFieldInfo` row existence), which are UDF-capable\n * (`getUdfInfo` row existence), and each resource's `apiEntity` (the\n * getFieldInfo endpoint segment) all come from the generated registry\n * (capabilities.ts, from capabilities.plan.json). The default resource\n * set is the FIVE workflow resources (WORKFLOW_RESOURCES) — never the\n * full 121: a default that fans out 121 wire calls is not \"on demand\".\n *\n * Honest scope (stated in the served text AND the result): the live\n * catalog reports a field's SHAPE (existence, requiredness, type,\n * maxLength, read-only, queryable, picklist-ness) as FLAGS and NAMES —\n * picklist-ness as a flag (isPickList) and picklist field names\n * (picklistFields). With the opt-in `labels: true`, picklist rows carry\n * the vendor's exposed picklist VALUES (labels next to each value);\n * without it the op serves no VALUES. It CANNOT resolve a picklist\n * VALUE the vendor does not expose to this API user (the W-A4 wall) —\n * retrying the catalog will not surface a withheld value.\n *\n * Zero mutating wire by construction: every fetch is a GET on the\n * entityInformation trio.\n */\nimport { AutotaskConfigError, AutotaskError, isAutotaskError } from '../errors.js';\nimport type { AutotaskClient } from '../client.js';\nimport type { PickListValue } from '../types/common.js';\nimport { CAPABILITIES, type CapabilityRecord } from '../capabilities.js';\nimport { FIELD_CACHE_KINDS, type FieldCacheKind } from '../fieldCache.js';\nimport { camelKey } from '../utils/index.js';\nimport { WORKFLOW_RESOURCES } from './types.js';\n\n/** The pinned wire cap: `resources × include` above it is refused\n * pre-request (CONFIG_ERROR naming the computed cost and the cap) —\n * refused, never truncated. */\nexport const MAX_FIELD_CATALOG_WIRE = 60;\n\n/** The stable honesty sentence served in the result (the live catalog\n * reports field SHAPE as FLAGS and NAMES; with the opt-in `labels: true`\n * the projected picklist rows carry the vendor's exposed picklist\n * VALUES; it cannot resolve a picklist VALUE the vendor does not expose\n * to this API user — the W-A4 wall). */\nexport const FIELD_CATALOG_HONESTY_NOTE =\n 'Live field metadata reports the SHAPE of a field (existence, requiredness, type, maxLength, read-only, queryable, picklist-ness) as FLAGS and NAMES: picklist-ness as a flag (isPickList) and picklist field names (picklistFields). ' +\n 'With the opt-in `labels: true`, picklist rows carry the vendor\\'s exposed picklist VALUES (labels next to each value); without it the op serves no VALUES. ' +\n 'It cannot resolve a picklist VALUE the vendor does not expose to this API user (the W-A4 wall — e.g. the attachments Type picklist): retrying the catalog will not surface a withheld value; that gap is vendor-side, not a client defect.';\n\n/** One projected field row (the stable, small served shape — not the raw\n * vendor blob; the raw one stays available through the resource's own\n * `getFieldInfo` / `getUdfInfo` op). */\nexport interface FieldCatalogFieldRow {\n /** The vendor field name. */\n name: string;\n /** The display label (UDF catalog rows only; vendor standard fields carry none). */\n label?: string;\n /** The vendor field type (`dataType` on standard fields, `type` on UDFs). */\n type: string;\n isRequired: boolean;\n isReadOnly: boolean;\n isQueryable: boolean;\n isPickList: boolean;\n /** The vendor `length` bound (null when the catalog names none). */\n maxLength: number | null;\n /** The referenced entity type for reference fields ('' when none). */\n referenceEntityType: string;\n /** The vendor's exposed picklist VALUES, verbatim (present exactly when the `labels` opt is `true` and the vendor exposed values for this picklist field — the vendor-walled and non-picklist rows carry none). */\n picklistValues?: PickListValue[];\n}\n\n/** One per-resource fault (partial failures are typed PER ROW — never all-or-nothing). */\nexport interface FieldCatalogRowError {\n code: string;\n message: string;\n}\n\n/** One resource's catalog row. */\nexport interface FieldCatalogRow {\n /** The plan resource key. */\n resource: string;\n /** The vendor entity name (the path segment; plan-derived). */\n apiEntity: string;\n /** True when the plan carries a `getUdfInfo` row for the resource (the vendor defines a UDF catalog endpoint for every entity resource — the catalog may answer an empty list). */\n udfCapable: boolean;\n /** The entity information model (present exactly when `info` was included and fetched). */\n info?: Record<string, unknown> | null;\n /** The projected standard-field catalog (present exactly when `fields` was included and fetched; when the `fields` opt is given, only the matching rows — the requested names absent here land in `unmatchedFields`). */\n fields?: FieldCatalogFieldRow[];\n /** The requested `fields`-filter names absent from this resource's fields catalog (in request order); `[]` when no filter is given, when the row carries no fields catalog (an `info`/`udf`-only include or a row error), or when nothing was missing. Reported, never an error. */\n unmatchedFields: string[];\n /** The projected UDF catalog (present exactly when `udf` was included and fetched). */\n udf?: FieldCatalogFieldRow[] | null;\n /** `isRequired === true` names, in catalog order (the `fields` catalog). */\n required: string[];\n /** `isReadOnly === true` names, in catalog order. */\n readOnly: string[];\n /** `isQueryable === true` names, in catalog order. */\n queryable: string[];\n /** `isPickList === true` names, in catalog order — NAMES only (see `honesty`: the VALUES may be vendor-walled). */\n picklistFields: string[];\n /** The FieldCache state for this row: `hit` = every included kind was served from the cache (no wire for the row); `age` = the oldest entry's age in ms (null when `hit` is false). */\n cache: { hit: boolean; age: number | null };\n /** The metadata reads this row issued (0 = fully cached; one per included kind otherwise — in-flight de-dup may make the actual wire smaller than this). */\n wire: number;\n /** The first per-kind failure (code + message); the sweep keeps going. */\n error: FieldCatalogRowError | null;\n}\n\n/** The sweep result. */\nexport interface FieldCatalogResult {\n /** The resolved client zone ('unknown' for a bare explicit baseUrl). */\n zone: string;\n /** The zone label (a live op has no plan-pinned tenant label — it mirrors `zone`). */\n label: string;\n /** Whether a FieldCache was configured at all. */\n cached: boolean;\n /** The resolved `labels` opt (the served payload names what it carries: `true` = the picklist rows may carry `picklistValues`). */\n labels: boolean;\n /** The configured TTL (null when no cache). */\n ttlMs: number | null;\n /** The call instant (ISO). */\n fetchedAt: string;\n /** One row per requested resource, in request order. */\n rows: FieldCatalogRow[];\n /** The metadata reads actually issued across the call (≤ `cap` by construction). */\n wireUsed: number;\n /** The wire cap the call ran under. */\n cap: number;\n /** Always false: over-cap requests REFUSE (CONFIG_ERROR) — they are never silently truncated. */\n truncated: false;\n counts: {\n /** The requested (deduplicated) resource count. */\n resources: number;\n /** The plan's `getFieldInfo`-bearing resource count (the field-capable set). */\n fieldCapableResources: number;\n /** The plan's `getUdfInfo`-bearing resource count (the vendor defines a UDF catalog endpoint for these; the narrower plan `udfCapable` flag — entities that actually carry UDFs — is a subset). */\n udfCapableResources: number;\n /** The rows served fully from the cache. */\n cached: number;\n };\n /** The honest scope: what the live catalog can and cannot report. */\n honesty: {\n /** The vendor's WIRE exposure of picklist values, informational only (orthogonal to the `labels` opt — it reports what the vendor exposed on the wire, not what the caller opted into): 'partial' when any row's raw vendor response carried picklist VALUES on the wire — computed over the full raw list, not the filtered subset; 'unexposed' otherwise. */\n picklistValues: 'unexposed' | 'partial';\n note: string;\n };\n}\n\n/** The optional call bag for `operations.fieldCatalog` (closed: unknown keys refuse). */\nexport interface FieldCatalogOptions {\n /** The plan resource keys to read. Omitted → the five workflow resources (never the full set — an on-demand op must not fan out 121 wire calls by default). */\n resources?: string[];\n /** What to fetch per resource (closed set `info` | `fields` | `udf`; default `['fields']`). */\n include?: FieldCacheKind[];\n /** Bypass the fieldCache for this call (fetch live, refresh the entries). Default false. */\n fresh?: boolean;\n /** The optional post-projection filter on the `fields`-kind rows only: keep the named fields (vendor names, trimmed, de-duplicated). Report-not-error: names absent from a resource's fields catalog land on that row's `unmatchedFields`, never an error; the `info` and `udf` rows are unaffected (the filter is a no-op on them). Applied after projection, on cache hits and wire reads alike — the cache entries stay the full raw list (zero extra wire, no invalidation). */\n fields?: string[];\n /** Opt-in: when `true`, the projected `fields`-kind and `udf`-kind picklist rows carry the vendor's exposed `picklistValues` (the raw vendor shape as-is — `{ value, label, parentValue?, isActive?, ... }`, `value` a string, zero transform) for the picklist fields. The W-A4 wall still applies (a value the vendor does not expose to this API user is not resolvable — retrying will not surface it). Default `false`: the rows carry no VALUES (today's exact output). Zero extra wire: the values ride the same cached raw rows. */\n labels?: boolean;\n}\n\nconst FIELD_CATALOG_OPT_KEYS: readonly string[] = ['resources', 'include', 'fresh', 'fields', 'labels'];\n\n/** Project one raw vendor field entry (standard `FieldInformationModel`\n * or UDF `Field`) to the stable served shape. */\nfunction projectFieldRow(raw: unknown, labels = false): FieldCatalogFieldRow {\n const r = (typeof raw === 'object' && raw !== null ? raw : {}) as Record<string, unknown>;\n const name = typeof r.name === 'string' ? r.name : '';\n const type = typeof r.dataType === 'string' ? r.dataType : typeof r.type === 'string' ? r.type : '';\n const values =\n labels && r.isPickList === true && Array.isArray(r.picklistValues) && r.picklistValues.length > 0\n ? (r.picklistValues as PickListValue[])\n : undefined;\n return {\n name,\n ...(typeof r.label === 'string' && r.label !== '' ? { label: r.label } : {}),\n type,\n isRequired: r.isRequired === true,\n isReadOnly: r.isReadOnly === true,\n isQueryable: r.isQueryable === true,\n isPickList: r.isPickList === true,\n maxLength: typeof r.length === 'number' ? r.length : null,\n referenceEntityType: typeof r.referenceEntityType === 'string' ? r.referenceEntityType : '',\n ...(values !== undefined ? { picklistValues: values } : {}),\n };\n}\n\n/** True when the raw vendor row carries picklist VALUES the vendor exposed. */\nfunction exposesPicklistValues(raw: unknown): boolean {\n const r = (typeof raw === 'object' && raw !== null ? raw : {}) as Record<string, unknown>;\n return Array.isArray(r.picklistValues) && r.picklistValues.length > 0;\n}\n\n/**\n * Apply the `fields` filter AFTER projection (the cache entry stays the\n * full raw list — zero extra wire, no invalidation) and recompute the\n * fields-kind derived lists FROM THE FILTERED rows so the row stays\n * self-consistent. `unmatchedFields` = the requested names absent from\n * this resource's fields catalog (reported, never an error). The `info`\n * and `udf` kinds never pass through here (the filter is fields-only).\n */\nfunction applyFieldsFilter(\n projected: FieldCatalogFieldRow[],\n filter: string[] | undefined,\n row: FieldCatalogRow,\n): void {\n const kept = filter === undefined ? projected : projected.filter((f) => filter.includes(f.name));\n if (filter !== undefined) {\n const present = new Set(projected.map((f) => f.name));\n row.unmatchedFields = filter.filter((n) => !present.has(n));\n }\n row.fields = kept;\n row.required = kept.filter((f) => f.isRequired).map((f) => f.name);\n row.readOnly = kept.filter((f) => f.isReadOnly).map((f) => f.name);\n row.queryable = kept.filter((f) => f.isQueryable).map((f) => f.name);\n row.picklistFields = kept.filter((f) => f.isPickList).map((f) => f.name);\n}\n\n/**\n * The plan-derived capability set (never hardcoded): the\n * `getFieldInfo` / `getUdfInfo` registry rows are the capability\n * evidence; the getFieldInfo endpoint segment is the vendor `apiEntity`.\n */\nfunction capabilitySets() {\n const fieldOps = new Map<string, CapabilityRecord>();\n const udfOps = new Map<string, CapabilityRecord>();\n const resources = new Set<string>();\n for (const rec of CAPABILITIES) {\n if (rec.resource === 'operations') continue;\n resources.add(rec.resource);\n if (rec.operation === 'getFieldInfo') fieldOps.set(rec.resource, rec);\n if (rec.operation === 'getUdfInfo') udfOps.set(rec.resource, rec);\n }\n return { fieldOps, udfOps, resources };\n}\n\n/** The vendor `apiEntity` (the `/V1.0/<E>/entityInformation/fields` segment), plan-derived. */\nfunction apiEntityFor(rec: CapabilityRecord): string {\n const m = /^GET \\/V1\\.0\\/([^/]+)\\/entityInformation\\/fields$/.exec(rec.endpoint ?? '');\n if (m === null) {\n throw new AutotaskConfigError(\n `fieldCatalog: the plan's getFieldInfo endpoint for \"${rec.resource}\" has no /V1.0/<Entity>/entityInformation/fields shape (${rec.endpoint}) — plan defect`,\n { operation: 'operations.fieldCatalog' },\n );\n }\n return m[1]!;\n}\n\n/**\n * Run the bounded live field-metadata sweep.\n *\n * ```ts\n * import { fieldCatalog } from 'node-autotask/operations';\n * const res = await fieldCatalog(client); // the 5 workflow resources, fields only\n * const fresh = await fieldCatalog(client, { resources: ['tickets'], include: ['fields', 'udf'], fresh: true });\n * ```\n *\n * @param client The wired client (the reads issue entityInformation GETs).\n * @param opts The call bag ({ resources?, include?, fresh?, fields?, labels? }).\n */\nexport async function fieldCatalog(\n client: AutotaskClient,\n opts?: FieldCatalogOptions,\n): Promise<FieldCatalogResult> {\n if (opts !== undefined && (typeof opts !== 'object' || opts === null || Array.isArray(opts))) {\n throw new AutotaskConfigError(\n 'fieldCatalog: opts must be an object { resources?: string[], include?: (info|fields|udf)[], fresh?: boolean, fields?: string[], labels?: boolean }',\n );\n }\n for (const key of Object.keys(opts ?? {})) {\n if (!FIELD_CATALOG_OPT_KEYS.includes(key)) {\n throw new AutotaskConfigError(\n `fieldCatalog: unknown opts key \"${key}\" — the bag is closed: ${FIELD_CATALOG_OPT_KEYS.join(', ')}`,\n { suggestedAction: 'Drop the unknown key (autotask_describe(operations.fieldCatalog) shows the exact bag).' },\n );\n }\n }\n\n const { fieldOps, udfOps, resources: allResources } = capabilitySets();\n\n // --- include: the closed kind set (pre-request, zero wire)\n const includeRaw = opts?.include ?? ['fields'];\n if (!Array.isArray(includeRaw) || includeRaw.length === 0) {\n throw new AutotaskConfigError('fieldCatalog: opts.include must be a non-empty array of (info|fields|udf)');\n }\n const include: FieldCacheKind[] = [];\n for (const kind of includeRaw) {\n if (typeof kind !== 'string' || !FIELD_CACHE_KINDS.includes(kind as FieldCacheKind)) {\n throw new AutotaskConfigError(\n `fieldCatalog: unknown include kind \"${String(kind)}\" — the valid kinds are: ${FIELD_CACHE_KINDS.join(', ')}`,\n { suggestedAction: `Filter with one or more of: ${FIELD_CACHE_KINDS.join(', ')} (default ['fields']).` },\n );\n }\n if (!include.includes(kind as FieldCacheKind)) include.push(kind as FieldCacheKind);\n }\n\n // --- resources: default the five workflow resources (never the full set)\n const resourcesRaw = opts?.resources ?? WORKFLOW_RESOURCES;\n if (!Array.isArray(resourcesRaw) || resourcesRaw.length === 0) {\n throw new AutotaskConfigError('fieldCatalog: opts.resources must be a non-empty array of plan resource keys');\n }\n const targets: string[] = [];\n for (const r of resourcesRaw) {\n if (typeof r !== 'string' || r.trim() === '') {\n throw new AutotaskConfigError(\n `fieldCatalog: opts.resources must contain non-empty plan resource key strings (got ${typeof r === 'string' && r.trim() === '' ? 'a blank string' : typeof r})`,\n );\n }\n const key = r.trim();\n const fieldOp = fieldOps.get(key);\n if (fieldOp === undefined) {\n if (allResources.has(key)) {\n // a known plan resource without a field catalog (the integration\n // singletons) — fail closed, name the boundary\n throw new AutotaskConfigError(\n `fieldCatalog: resource \"${key}\" has no field catalog — the vendor defines the entityInformation trio for the ${fieldOps.size} plan entity resources only`,\n { suggestedAction: `Pass one of the ${fieldOps.size} field-capable plan keys (list them with autotask_catalog).` },\n );\n }\n throw new AutotaskError(\n `fieldCatalog: unknown resource \"${key}\" — the plan has ${fieldOps.size} field-capable resources`,\n {\n code: 'RESOURCE_UNKNOWN',\n category: 'validation',\n suggestedAction: 'Pass the exact plan resource key (snake_case) from autotask_catalog (e.g. tickets, companies, configuration_items).',\n },\n );\n }\n if (!targets.includes(key)) targets.push(key);\n }\n\n // --- fields: the optional post-projection filter (fields-kind rows only;\n // report-not-error — unknown names land on the row, never a refusal)\n let fieldsFilter: string[] | undefined;\n const fieldsRaw = opts?.fields;\n if (fieldsRaw !== undefined) {\n if (!Array.isArray(fieldsRaw) || fieldsRaw.length === 0) {\n throw new AutotaskConfigError('fieldCatalog: opts.fields must be a non-empty array of vendor field name strings');\n }\n const names: string[] = [];\n for (const f of fieldsRaw) {\n if (typeof f !== 'string' || f.trim() === '') {\n throw new AutotaskConfigError(\n `fieldCatalog: opts.fields must contain non-empty vendor field name strings (got ${typeof f === 'string' && f.trim() === '' ? 'a blank string' : typeof f})`,\n );\n }\n const name = f.trim();\n if (!names.includes(name)) names.push(name);\n }\n fieldsFilter = names;\n }\n\n // --- labels: the opt-in picklist-VALUES projection (pre-request, zero wire)\n if (opts !== undefined && opts.labels !== undefined && typeof opts.labels !== 'boolean') {\n throw new AutotaskConfigError(\n `fieldCatalog: opts.labels must be a boolean (got ${typeof opts.labels})`,\n );\n }\n const labels = opts?.labels === true;\n\n // --- the cap: refused, never truncated (pre-request, zero wire)\n const cost = targets.length * include.length;\n if (cost > MAX_FIELD_CATALOG_WIRE) {\n throw new AutotaskConfigError(\n `fieldCatalog: ${targets.length} resource(s) × ${include.length} kind(s) = ${cost} metadata reads exceed the wire cap of ${MAX_FIELD_CATALOG_WIRE} — the call is refused above its cap (never truncated)`,\n { suggestedAction: `Pass a smaller resources list or a narrower include set so the product stays ≤ ${MAX_FIELD_CATALOG_WIRE}.` },\n );\n }\n\n const cache = client.http.fieldCache;\n const fresh = opts?.fresh === true;\n const zone = client.config.zone ?? 'unknown';\n const rows: FieldCatalogRow[] = [];\n let wireUsed = 0;\n let anyPicklistValues = false;\n\n // The sweep (sequential bounded reads; per-kind failures recorded —\n // one entity's vendor 500 never aborts the call, the probeReachability\n // contract).\n for (const resource of targets) {\n const fieldOp = fieldOps.get(resource);\n if (fieldOp === undefined) continue; // unreachable: validated above\n const apiEntity = apiEntityFor(fieldOp);\n const holder = (client as unknown as Record<string, unknown>)[camelKey(resource)] as\n | {\n getEntityInfo?: () => Promise<unknown>;\n getFieldInfo?: () => Promise<unknown>;\n getUdfInfo?: () => Promise<unknown>;\n }\n | undefined;\n const row: FieldCatalogRow = {\n resource,\n apiEntity,\n udfCapable: udfOps.has(resource),\n unmatchedFields: [],\n required: [],\n readOnly: [],\n queryable: [],\n picklistFields: [],\n cache: { hit: false, age: null },\n wire: 0,\n error: null,\n };\n\n const fetches: Record<FieldCacheKind, () => Promise<unknown>> = {\n info: () => holder?.getEntityInfo?.() ?? Promise.reject(new AutotaskError(`fieldCatalog: the client exposes no getEntityInfo read for \"${resource}\"`, { code: 'INVALID_RESPONSE', category: 'server' })),\n fields: () => holder?.getFieldInfo?.() ?? Promise.reject(new AutotaskError(`fieldCatalog: the client exposes no getFieldInfo read for \"${resource}\"`, { code: 'INVALID_RESPONSE', category: 'server' })),\n udf: () => (holder?.getUdfInfo?.() ?? Promise.reject(new AutotaskError(`fieldCatalog: the client exposes no getUdfInfo read for \"${resource}\"`, { code: 'INVALID_RESPONSE', category: 'server' }))),\n };\n\n // fresh: the caller's act — drop the entity's entries (and any in-flight\n // request) BEFORE the sweep, so every included kind fetches live and\n // refreshes its entry. The trio methods keep their no-arg surface; the\n // bypass rides the cache's first-class invalidate API.\n if (fresh) cache?.invalidate(resource);\n\n let allCached = true;\n const ages: number[] = [];\n for (const kind of include) {\n // The cache state (pre-fetch): a full hit skips the wire entirely.\n const peek = cache !== undefined && !fresh ? cache.peek(resource, kind) : { hit: false, age: null };\n if (peek.hit !== true) allCached = false;\n if (peek.hit === true && cache !== undefined) {\n const value = cache.get(resource, kind);\n if (kind === 'info') row.info = (value ?? null) as Record<string, unknown> | null;\n else {\n const list = Array.isArray(value) ? value : [];\n const projected = list.map((f) => projectFieldRow(f, labels));\n if (kind === 'fields') applyFieldsFilter(projected, fieldsFilter, row);\n else row.udf = projected;\n // honesty is computed over the FULL raw list, not the filtered subset\n for (const f of list) if (exposesPicklistValues(f)) anyPicklistValues = true;\n }\n if (peek.age !== null) ages.push(peek.age);\n continue;\n }\n // A wire read (one per included kind); a failure lands on the row.\n let value: unknown;\n try {\n value = await fetches[kind]();\n } catch (err) {\n // A cancel (or a programming error) is not a row fault: it propagates,\n // so the sweep stops issuing wire after the caller aborted.\n if (!isAutotaskError(err) || err.code === 'ABORTED') throw err;\n wireUsed += 1;\n row.wire += 1;\n if (row.error === null) row.error = { code: err.code, message: err.message };\n continue;\n }\n wireUsed += 1;\n row.wire += 1;\n if (kind === 'info') {\n row.info = (value ?? null) as Record<string, unknown> | null;\n } else {\n if (!Array.isArray(value)) {\n // a drifted response is a fault, never \"this entity has zero fields\"\n if (row.error === null) row.error = { code: 'INVALID_RESPONSE', message: `fieldCatalog: the ${kind} response for ${resource} was not a list` };\n continue;\n }\n const list = value;\n const projected = list.map((f) => projectFieldRow(f, labels));\n if (kind === 'fields') applyFieldsFilter(projected, fieldsFilter, row);\n else row.udf = projected;\n // honesty is computed over the FULL raw list, not the filtered subset\n for (const f of list) if (exposesPicklistValues(f)) anyPicklistValues = true;\n }\n }\n row.cache = allCached ? { hit: true, age: ages.length > 0 ? Math.max(...ages) : 0 } : { hit: false, age: null };\n rows.push(row);\n }\n\n return {\n zone,\n label: zone,\n cached: cache !== undefined,\n labels,\n ttlMs: cache?.ttlMs ?? null,\n fetchedAt: new Date().toISOString(),\n rows,\n wireUsed,\n cap: MAX_FIELD_CATALOG_WIRE,\n truncated: false,\n counts: {\n resources: targets.length,\n fieldCapableResources: fieldOps.size,\n udfCapableResources: udfOps.size,\n cached: rows.filter((r) => r.cache.hit === true).length,\n },\n honesty: {\n picklistValues: anyPicklistValues ? 'partial' : 'unexposed',\n note: FIELD_CATALOG_HONESTY_NOTE,\n },\n };\n}\n","/**\n * BaseResource — shared scaffolding for every resource client\n * (ARCHITECTURE section 11).\n *\n * Concrete resources extend `BaseResource` and expose narrowly-typed public\n * methods that delegate to the protected primitives here. The base stays\n * generic about filters (the G3 `query.ts` builder is the single filter\n * surface; resources pass user filters through, never invent per-resource\n * filter sets).\n *\n * Wire contract (pinned, node-proven, UNVERIFIED-live — see G4 report):\n * - page 1: `POST /V1.0/<E>/query` with the `QueryModel` body\n * (`{ MaxRecords, IncludeFields?, filter }` — G3 `buildQueryRequest`).\n * - subsequent pages: the vendor returns an ABSOLUTE `pageDetails.nextPageUrl`\n * cursor; the walk POSTs the preserved filter to the cursor verbatim\n * (same-origin: stripped of the client base; cross-origin: re-based onto the\n * client base URL, mirroring the node's custom-zone behaviour) until\n * `nextPageUrl` is null. The 1000-page guard (`MAX_PAGES`) is enforced by\n * the G3 walker (`PaginationLimitError` before the 1001st fetch).\n * - `item: null` on a single GET is the vendor not-found signal →\n * `NotFoundError` (G3 `unwrapItem`).\n * - create/update/delete normalise `OperationResultModel { itemId }` (or\n * `{ id }`) to `{ id }`; attachment deletes return the deleted model.\n */\nimport {\n AutotaskConfigError,\n AutotaskError,\n isAutotaskError,\n NotFoundError,\n ResolutionError,\n StaleObjectError,\n} from '../errors.js';\nimport {\n buildQueryRequest,\n cursorToPath,\n unwrapItem,\n unwrapItems,\n unwrapOperation,\n unwrapQueryCount,\n type HttpClient,\n} from '../http.js';\nimport type { FieldCacheKind } from '../fieldCache.js';\nimport { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE } from '../config.js';\nimport {\n MAX_PAGES,\n clampPageSize,\n paginate,\n paginateItems,\n collectAll,\n type PageFetcher,\n} from '../pagination.js';\nimport { buildFilter, normalizedConditions } from '../query.js';\nimport { resolveFieldsPreset } from '../field-presets.js';\nimport { REDACTED } from '../logger.js';\nimport { isRedactedFieldName, redactResponseBody, type RedactionPolicy } from '../redact.js';\nimport { isIdentifierCandidate, isRecord, parseIdentifier } from '../utils/index.js';\nimport {\n BLIND_SURFACE_STAMPS,\n DELETE_BOUNDARY_NOTES,\n EMPTY_REASON_STAMPS,\n RESPONSE_DRIFT_MARKERS,\n UNTRUSTED_FIELDS_BY_RESOURCE,\n type BlindSurfaceInfo,\n} from '../relationships.js';\nimport { RESOURCE_KEY_BY_PATH } from '../cache-ttl-tables.js';\nimport type {\n DryRunResult,\n EmptyReasonInfo,\n EntityInformationModel,\n Field,\n FieldDiff,\n FieldInformationModel,\n FilterCondition,\n FilterValue,\n Identifier,\n OperationResult,\n OperationShapeDrift,\n Page,\n QueryParams,\n Resolution,\n ResolutionCaps,\n UdfField,\n} from '../types/common.js';\n\n/** Resource description handed to `BaseResource` (one instance per resource). */\nexport interface BaseResourceConfig {\n /** Plan key / registry name, e.g. 'companies'. */\n key: string;\n /** Versioned global URL segment, e.g. '/V1.0/Companies'. */\n resourcePath: string;\n /** Versioned parent-scoped template, e.g. '/V1.0/Companies/{parentId}/Notes'. Absent for top-level. */\n parentScopedPath?: string;\n /** Parent field used to narrow the global query, e.g. 'companyID'. */\n parentField?: string;\n /** Whether the vendor defines DELETE for this entity (documented; the generated\n * surface decides method presence from the plan rows). */\n deletable?: boolean;\n /** Whether the entity is UDF-capable (create/update normalise a UDF map to\n * `userDefinedFields: [{ name, value }]`). */\n udfCapable?: boolean;\n /** Primary text fields the vendor indexes (plan `searchCovers`): `resolve`\n * (bare value) and `search` (bounded contains) query them; `[]` = id-only. */\n searchFields?: string[];\n /** The vendor field compared before a mutation (plan `staleCheck` column);\n * absent when the model lacks the field (`\"unavailable\"`). */\n staleField?: string;\n /** The parent entity's global path (parent-scoped resources only):\n * dry-run referenced-resource verification fetches `parentPath/{parentId}`. */\n parentPath?: string;\n /** Attachment models answer a bare MODEL on GET (quirk #9): dry-run and\n * stale-check current-record fetches use the model-shaped read for these. */\n attachmentGet?: boolean;\n /** D1: confirmed updates hit the COLLECTION path (`PUT /V1.0/<E>`, the\n * record id merged into the body) instead of the item path — the vendored\n * spec defines no put/patch on the item path for these resources (it is\n * GET-only; a PUT to it 405s). Derived from api-docs.json by\n * scripts/generate-batch.mjs; the drift guard is\n * test/resources/collection-update.test.ts (the flag set must equal the\n * spec-derived set). Absent/false = the item path (`PUT /V1.0/<E>/{id}`).\n * Top-level resources only (parent-scoped updates always route to the\n * scoped collection in `updateScopedRaw`). */\n collectionUpdate?: boolean;\n}\n\n/** The `queryBounded` default TOTAL record cap (server-side pagination). */\nexport const BOUNDED_QUERY_DEFAULT_LIMIT = 500;\n/** The `queryBounded` hard TOTAL record cap (an AutotaskConfigError above it). */\nexport const BOUNDED_QUERY_MAX_LIMIT = 2500;\n/** Issue #59: the `latest` probe budget — the initial count + every id-threshold count probe. */\nexport const LATEST_MAX_COUNT_PROBES = 64;\n\n/** Issue #13: the marker-recovery search cap — ONE bounded query, this many matches max (a full page + a next cursor = truncated — never a guessed id). */\nexport const MARKER_RECOVERY_LIMIT = 5;\n\n/**\n * Issue #13: the deterministic shape descriptor of a drifted 2xx body —\n * the top-level keys (sorted) with their type classes, ONE level deep. No\n * vendor VALUES ride in it (the redaction-safe \"snippet\": a raw value could\n * be PII; the shape names the drift, the values never leave the tenant\n * except through the normal envelope).\n */\nexport function describeResponseShape(body: unknown): string {\n if (body === null) return 'null';\n if (Array.isArray(body)) return `array(len=${body.length})`;\n if (typeof body !== 'object') return typeof body;\n const rec = body as Record<string, unknown>;\n const keys = Object.keys(rec).sort();\n const typeOf = (v: unknown): string => (v === null ? 'null' : Array.isArray(v) ? 'array' : typeof v);\n const parts = keys.slice(0, 16).map((k) => `${k}:${typeOf(rec[k])}`);\n const more = keys.length > 16 ? `, +${keys.length - 16} more` : '';\n return `{ ${parts.join(', ')}${more} }`;\n}\n\n/**\n * Issue #13: the default marker token from the request body — the `name`\n * value first, else the `title` value (the caller already knows the name it\n * sent; the campaign's drifted creates carried their marker there). Non-\n * empty string only; null = nothing to search (the typed error stands).\n */\nexport function defaultMarkerToken(data: Record<string, unknown>): string | null {\n for (const field of ['name', 'title'] as const) {\n const v = data[field];\n if (typeof v === 'string' && v.trim() !== '') return v.trim();\n }\n return null;\n}\n\n/**\n * Issue #36: the FK 'absent' negative-cache marker for the composite context\n * fetch (`BaseResource.contextFetch`). The marker lives in the SAME ReadCache\n * (no second cache) under a namespaced key the positive get path never\n * constructs — the normal `.get`/`resolve` 404 behaviour is bit-for-bit\n * untouched. Any defined value under the marker key means the FK target\n * answered a vendor not-found within the read entity's TTL.\n */\nconst CONTEXT_ABSENT_MARKER = '#context-absent';\n\n/** The marker key for a read path (the `\\u0000` suffix is unencodable in a wire path — no collision). */\nfunction contextAbsentKey(path: string): string {\n return path + '\\u0000context-absent';\n}\n\n/**\n * Issue #61 (slice A): the explicit noteChars truncation marker — the\n * deterministic suffix naming the OMITTED length (N = chars removed;\n * elision + fixed marker, no timestamps — pinned-test friendly and\n * public-safe: only the capped prefix of the original value survives).\n * The marker rides INSIDE the value, so the server's untrusted wrapper\n * wraps the truncated value + marker (the marker describes vendor text —\n * correct inside the untrusted tags; the truncation is BEFORE the wrap).\n */\nexport function noteCharsTruncationMarker(charsRemoved: number): string {\n return `\\u2026 [+${charsRemoved} chars truncated]`;\n}\n\n/**\n * Issue #61 (slice A): the pure per-field truncation (copy-on-truncate —\n * the `markUntrusted` idiom: the input records are NEVER mutated). Each\n * item is copied only when one of its untrusted-class string fields is\n * longer than the cap; a capped value = `value.slice(0, cap)` + the\n * marker. Returns `[items, truncatedFieldCount]` (count = the truncated\n * (item, field) pairs — the `noteCharsTruncated` stamp; 0 = no copy\n * churn on short values).\n */\nexport function truncateNoteChars<T>(items: T[], cap: number, fields: readonly string[]): [T[], number] {\n let truncated = 0;\n const out: T[] = items.map((item) => {\n if (!isRecord(item)) return item;\n let changed = false;\n const copy: Record<string, unknown> = { ...item };\n for (const field of fields) {\n const v = copy[field];\n if (typeof v === 'string' && v.length > cap) {\n // never cut inside a surrogate pair (a lone high surrogate is invalid text)\n const end = cap > 0 && (v.charCodeAt(cap - 1) & 0xfc00) === 0xd800 ? cap - 1 : cap;\n copy[field] = v.slice(0, end) + noteCharsTruncationMarker(v.length - end);\n truncated += 1;\n changed = true;\n }\n }\n return changed ? (copy as unknown as T) : item;\n });\n return [out, truncated];\n}\n\n/** Params for `queryBounded`: the query params + the TOTAL record cap. */\nexport interface BoundedQueryParams extends QueryParams {\n /**\n * TOTAL records to return (NOT a page size): default 500, hard max 2500\n * (above it throws AutotaskConfigError). The internal walk chooses the\n * page size (min(500, limit)); `maxRecords` is ignored by this method.\n */\n limit?: number;\n /**\n * Issue #59: return the N highest-`id` rows (1..2500, i.e.\n * `BOUNDED_QUERY_MAX_LIMIT`); the vendor has no sort parameter, so this\n * is a count-anchored mechanism (see the `latestWalk` docs); `limit` and\n * `latest` may coexist only when `limit >= latest`.\n */\n latest?: number;\n /**\n * Issue #61 (slice A): opt-in per-field char cap on the resource's\n * untrusted-class free-text fields (notes/descriptions/UDF prose — the\n * generated `UNTRUSTED_FIELDS_BY_RESOURCE` set, the SAME set the MCP\n * projection wraps). Integer >= 1; ABSENT = the raw, untruncated result\n * bit-for-bit. The truncation runs at result-build — BEFORE the\n * server-side untrusted wrapper (the src/untrusted.ts contract: the\n * caller truncates first, then wraps) — and is response-side only\n * (zero wire). `0` / negative / non-integer is refused pre-request\n * (`AutotaskConfigError`, zero wire).\n */\n noteChars?: number;\n /**\n * Issue #61 (slice B): a closed includeFields PRESET name (the\n * hand-authored FIELD_PRESETS list — v1: `billing_join` on billing_items).\n * Resolved PRE-WALK to the walk's `includeFields` (the vendor's column\n * selection rides the existing IncludeFields wire path; `id` is always\n * appended by the P1 id-append — zero extra wire). The refusals are\n * pre-request (zero wire): unknown name / resource mismatch / an explicit\n * `includeFields` in the same bag (see src/field-presets.ts).\n */\n fieldsPreset?: string;\n}\n\n/** The bounded, complete-enough result of `queryBounded`. */\nexport interface BoundedQueryResult<T> {\n items: T[];\n /** Total records returned (= items.length). */\n fetched: number;\n /**\n * True when the walk was truncated (by the limit or the 1000-page guard)\n * AND more records exist past the stop point: a non-null next cursor was\n * seen at the stop, or the final page had to be sliced to meet the limit.\n */\n hasMore: boolean;\n /** Pages fetched by the internal walk. */\n pagesWalked: number;\n /**\n * Deliberately always omitted: the vendor documents `pageDetails.count` as\n * the CURRENT PAGE's record count (not a total), so it must never be\n * surfaced as a total here — `<resource>.count` is the total.\n */\n count?: number;\n /**\n * S12-C (T10): the typed blind-surface sentinel — present ONLY when the\n * walk returned zero items on a plan-pinned blind surface (`unfiltered-blind`\n * surfaces additionally require the call to be unfiltered). Additive: the\n * walk values above are never mutated. The stamp derives from\n * plan.blindSurfaces (generated src/relationships.ts) and carries the zone\n * fact + the `get(id)`-is-the-authority remedy (docs/API.md §11.7).\n */\n blindSurface?: BlindSurfaceInfo;\n /**\n * Issue #14: the typed empty-reason on a 0-item walk — the blind pin\n * synthesizes the `blind-surface` reason (the sentinel's byte-identical\n * note); a plan-pinned empty-for-user surface rides its reason directly.\n * Additive: items/fetched/hasMore are never mutated.\n */\n emptyReason?: EmptyReasonInfo;\n /**\n * Issue #61 (slice A): the additive noteChars stamp — the count of the\n * TRUNCATED FIELDS (per field, across the returned items). Present ONLY\n * when > 0 (the additive-only-when-present house pattern: `blindSurface`,\n * `emptyReason`, `shapeDrift`). Absent = no field was truncated (the cap\n * was absent, or every value sat at or under it). Additive: the\n * items/fetched/hasMore walk values are never mutated (copy-on-truncate).\n */\n noteCharsTruncated?: number;\n}\n\n/**\n * Issue #14: synthesize the `blind-surface` empty-reason from a pinned\n * sentinel — the note is the pin's BYTE-IDENTICAL note (the six existing\n * sentinels keep their current wording; the reason field is additive).\n */\nfunction blindEmptyReason(stamp: BlindSurfaceInfo): EmptyReasonInfo {\n return {\n surface: stamp.surface,\n kind: 'blind-surface',\n note: stamp.note,\n authority: stamp.authority,\n remedy: 'the note is the remedy — the authority op answers for a record',\n };\n}\n\n/**\n * Issue #14: override a target-miss error's empty-reason with the pinned\n * UPDATE row (the update's own target read — the merge read / the stale\n * guard's read — is the op's own step; the generic `.get` not-found reason\n * the transport attached does not explain an UPDATE miss). Additive: the\n * error code / status / message are untouched.\n */\nfunction attachUpdateTargetMissReason(err: AutotaskError, key: string): void {\n const pinned = EMPTY_REASON_STAMPS[key]?.update;\n if (pinned === undefined) return;\n err.details = { ...(err.details ?? {}), emptyReason: pinned };\n}\n\n/**\n * S12-C (T10): the result of `count` on a plan-pinned blind surface — the\n * ONE case where `count` returns an object instead of a plain number. The\n * value is always 0 (a non-zero count is returned as the plain number), and\n * the typed sentinel states the zone fact + the `get(id)`-is-the-authority\n * remedy (a 0/empty result on a blind surface proves nothing).\n */\nexport interface BlindCountResult {\n /** The count value (always 0 when the sentinel is present). */\n count: number;\n /** The typed blind-surface sentinel (the zone fact + the authority remedy). */\n blindSurface: BlindSurfaceInfo;\n}\n\n/** Per-walk cursor state (one closure per `query`/`queryAll`/`queryBounded` call — walks never share state). */\ninterface QueryWalkState {\n /** Absolute `pageDetails.nextPageUrl` from the previous page. */\n cursor: string | null;\n}\n\n/** Normalised result of a `createIfNotExists` composition. */\nexport interface CreateIfNotExistsResult<T> {\n /** The existing (match) or newly created record id. */\n id: Identifier;\n /** `false` when a dedup match short-circuited the create. */\n created: boolean;\n /** The matched record (present when `created` is false). */\n existing?: T;\n}\n\n/**\n * Mutation options accepted by EVERY mutation (section 19.3): the dry-run\n * flag and the caller-observed `lastModifiedDate` for the stale-object guard.\n */\nexport interface MutationOpts {\n /**\n * Simulate: the mutating request is NEVER issued. The op performs input\n * validation, referenced-resource verification, duplicate detection where\n * a reliable lookup exists and the stale-object check, then returns the\n * pinned `DryRunResult` envelope (`simulated: true` is mandatory).\n */\n dryRun?: boolean;\n /**\n * The `lastModifiedDate` last observed by the caller. When the resource's\n * model carries the plan's `staleCheck` field, the vendor's current value\n * is compared before the mutation; a mismatch throws `STALE_OBJECT`.\n * Ignored where the model lacks the field.\n */\n lastModifiedDate?: string;\n /**\n * `update` only, `collectionUpdate` resources: send the caller's body RAW\n * (as-is, after the usual UDF normalisation) — NO merge into the current\n * record and no merge read. The compatibility escape hatch: full models\n * and intentional partials that the vendor accepts pass straight through,\n * exactly the pre-merge wire. With a `lastModifiedDate` token the stale\n * guard still performs its own verification read. Ignored by create/delete\n * and by non-collectionUpdate updates (their item-path PUT has no merge to\n * switch off).\n */\n raw?: boolean;\n}\n\n/**\n * Issue #13: the create-path response-shape-drift recovery options\n * (create only — update/delete take the plain `MutationOpts`). When the plan\n * pins a `responseDrift` marker field for the resource and a create answers\n * 2xx with a body that is NOT the specced envelope (or an `{ id }` /\n * `{ itemId }` alternative), ONE bounded read-only query on the resource's\n * own surface looks for the caller's marker; exactly one numeric match\n * yields the normal success result stamped `idFrom: 'marker-recovery'` +\n * `shapeDrift`, anything else keeps the existing `INVALID_RESPONSE` with the\n * drift detail (candidate ids listed — never a guessed id).\n *\n * PRECONDITION (the honest scope, post-verification): recovery can only find\n * what the caller stamped. The default `markerToken` is the request body's\n * `name` (else `title`) — the campaign convention, where drift-creating\n * callers stamp a unique marker there; a create with no unique marker yields\n * 0 or many matches and the typed refusal stands (recovery declines to\n * guess). Callers with a marker elsewhere pass `markerToken`/`markerField`\n * explicitly.\n *\n * The search is COLLECTION-LEVEL on purpose: the single condition is\n * `markerField contains token` — it is NOT narrowed by the parent (e.g.\n * ticketID) because this resource's query filter field set is not\n * live-verifiable here (the pinned field `name` is itself absent from the\n * vendored model — an unverified filter field would risk a vendor 500 and\n * convert a working recovery into a failure). A unique marker token makes\n * the collection-wide contains functionally scoped; a non-unique marker is\n * exactly the 0/many case the refusal contract covers (never a guessed id).\n * The option bag reaches create through the typed client API;\n * the governed/MCP create path (`operations.invoke` / `autotask_write`) has\n * no options slot, so there recovery is always on where the plan pins a\n * marker field (the opt-out is typed-client-only).\n */\nexport interface CreateRecoveryOpts {\n /** The marker field to search (default: the plan-pinned `responseDrift` marker field for the resource). */\n markerField?: string;\n /** The marker token to search for (default: the request body's `name`, else `title`, value). */\n markerToken?: string;\n /** Run the bounded marker recovery on a drifted create response (default: true where the plan pins a marker field; `false` restores the pre-recovery behaviour exactly — the typed error stands, zero extra requests). */\n recoverIdFromMarker?: boolean;\n}\n\n/** The mutation options accepted by a `create` (the shared `MutationOpts` + the issue #13 recovery bag). */\nexport type CreateOpts = MutationOpts & CreateRecoveryOpts;\n\n/** One dry-run check entry (`checks: [{ name, ok, note? }]` in the envelope). */\nexport interface DryRunCheck {\n name: string;\n ok: boolean;\n /**\n * Issue #14: the deterministic one-line note for the check (e.g. the\n * pinned empty-reason note on a `current-record-exists` miss) — additive.\n */\n note?: string;\n}\n\n/** Input to the pinned dry-run envelope builder (per-op paths assemble it). */\nexport interface DryRunSpec<TData> {\n /** The registry operation name, e.g. `companies.update`. */\n operation: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** The path that WOULD be hit. */\n path: string;\n /** The affected record ids (empty for a create that targets no id yet). */\n ids: Identifier[];\n checks: DryRunCheck[];\n impact: { affected: number; scope: string; reversible: boolean };\n /** Present only when the current record is fetchable (updates). */\n diff?: FieldDiff[];\n /** The typed input that would be applied (present for writes). */\n data?: TData;\n warnings?: string[];\n /** Issue #14: the typed empty-reason for a target-miss dry run (additive). */\n emptyReason?: EmptyReasonInfo;\n}\n\n/**\n * Assemble the pinned dry-run envelope (section 19.3). `simulated: true` is\n * mandatory and the builder cannot produce anything else; `wouldApply` is\n * derived from the checks (any failing check refuses the would-be mutation).\n *\n * Input-echo redaction (INV-E M3): the caller-input fields (`data` and\n * `diff[].to`) are assembled IN-PROCESS — they never cross the 2xx choke\n * point — so the SAME shared transform (`redactResponseBody`) with the SAME\n * resolved policy applies at this single envelope site, before the envelope\n * is returned: SECRET is always redacted (no opt-out), PII + CONFIDENTIAL per\n * `redactPersonalData`. The parameter defaults to `true` — the safe\n * direction: a call site that does not thread the resolved policy redacts\n * MORE, never less. `diff[].from` is the vendor-fetched current value\n * (already redacted at the choke point); the remaining envelope fields are\n * derived, not caller input.\n */\nexport function buildDryRunResult<TData>(\n spec: DryRunSpec<TData>,\n policy: RedactionPolicy = { redactPersonalData: true },\n): DryRunResult<TData> {\n if (spec.operation === '') {\n throw new AutotaskConfigError('dry-run: the operation name is required');\n }\n const wouldApply = spec.checks.every((check) => check.ok);\n const resource = spec.operation.split('.')[0] ?? spec.operation;\n const diffPart =\n spec.diff !== undefined\n ? {\n diff: spec.diff.map((entry) => {\n if (entry.to === undefined) return entry;\n // `to` is the caller's input VALUE for `entry.field`: the transform\n // is key-name based, so a pinned field name carries the marker\n // directly; a non-pinned field's value gets the same deep scan the\n // response transform applies (nested pinned keys inside objects/\n // arrays are still caught).\n const to = isRedactedFieldName(entry.field, policy)\n ? REDACTED\n : redactResponseBody(entry.to, policy);\n return { ...entry, to };\n }),\n }\n : {};\n const dataPart = spec.data !== undefined ? { data: redactResponseBody(spec.data, policy) as TData } : {};\n return {\n operation: spec.operation,\n wouldApply,\n target: { resource, ids: spec.ids },\n request: { method: spec.method, path: spec.path },\n ...diffPart,\n checks: spec.checks,\n impact: spec.impact,\n simulated: true,\n warnings: spec.warnings ?? [],\n ...dataPart,\n ...(spec.emptyReason !== undefined ? { emptyReason: spec.emptyReason } : {}),\n };\n}\n\n/**\n * Best-effort before/after diff for an update dry-run: one entry per field\n * the caller would set (the always-present `id` is excluded; fields whose\n * value would not change are omitted).\n */\nexport function computeFieldDiff(current: Record<string, unknown>, data: object): FieldDiff[] {\n const out: FieldDiff[] = [];\n for (const [field, to] of Object.entries(data as Record<string, unknown>)) {\n if (field === 'id' || to === undefined) continue;\n const from = current[field];\n if (from !== undefined && JSON.stringify(from) === JSON.stringify(to)) continue;\n out.push({ field, from: from === undefined ? null : from, to });\n }\n return out;\n}\n\n/**\n * V2 partial-update merge: overlay a caller's partial `data` onto the\n * record's CURRENT full model (the vendor's top-level collection PUT\n * validates the FULL model — a partial body is rejected with 500 'Missing\n * Required Field'). Pinned semantics:\n * - an explicit `null` in `data` sends null (caller intent to clear);\n * - an `undefined` value (or a key the caller omitted) keeps the current\n * value — it is never written to the merged body;\n * - every other key overrides the current value wholesale (no per-name\n * merge inside `userDefinedFields` or other nested fields);\n * - pure: neither argument is mutated; `id` is re-asserted by the caller\n * (`updateGlobal`) after the merge.\n */\nexport function mergePartialBody(\n current: Record<string, unknown>,\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...current };\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue; // keep the current value\n merged[key] = value; // explicit null sends null; anything else overrides\n }\n return merged;\n}\n\n/** Normalise a user UDF input (map or array) to `userDefinedFields: [{ name, value }]`. */\nfunction normalizeUdfInput(value: unknown): UdfField[] {\n if (Array.isArray(value)) {\n return value.map((entry) => {\n if (!isRecord(entry) || typeof entry.name !== 'string' || entry.name === '') {\n throw new AutotaskConfigError('userDefinedFields array entries must be { name, value } objects');\n }\n return { name: entry.name, value: entry.value };\n });\n }\n if (isRecord(value)) {\n return Object.entries(value).map(([name, entryValue]) => ({ name, value: entryValue }));\n }\n throw new AutotaskConfigError('userDefinedFields must be an array of { name, value } entries or a name-to-value map');\n}\n\n/**\n * S12-C (T10) post-merge P1: the single filter-aware stamp predicate for the\n * blind-surface sentinel — the ONE place the `kind` → stamp decision lives\n * (the query wrap, the count wrap, and the `companies.fullProfile`\n * open-tickets part all use it, so no consumer can drift):\n * - `unowned-blind` / `fully-blind`: stamps regardless of filter — the\n * surface is blind in every scope (companies not owned by the caller are\n * invisible to count/query no matter the filter).\n * - `unfiltered-blind`: stamps ONLY the unfiltered call — the vendor's\n * filtered query returns data (live-verified S12-B P1: 3 open tickets via\n * a companyID+status filter), so a filtered empty result is a TRUE\n * ABSENCE, never a sentinel.\n */\nexport function blindStampFor(\n stamp: BlindSurfaceInfo | undefined,\n filter: QueryParams['filter'] | undefined,\n): BlindSurfaceInfo | undefined {\n if (stamp === undefined) return undefined;\n if (stamp.kind !== 'unfiltered-blind') return stamp;\n const conditions = normalizedConditions(filter);\n return conditions === undefined || conditions.length === 0 ? stamp : undefined;\n}\n\n/** Decode a file envelope (FileQueryResultModel) or a top-level base64 string into a Buffer. */\nexport function decodeFileData(body: unknown): Buffer {\n if (isRecord(body)) {\n const data = body.data;\n if (typeof data === 'string') return Buffer.from(data, 'base64');\n if (Array.isArray(data) && data.every((b) => typeof b === 'number')) {\n return Buffer.from(data as number[]);\n }\n }\n if (typeof body === 'string') return Buffer.from(body, 'base64');\n throw new AutotaskError(\n 'Expected the file envelope FileQueryResultModel { data } (or a base64 string); got a different shape',\n { code: 'INVALID_RESPONSE', category: 'server' },\n );\n}\n\n/** Issue #78: why a resolve or search miss is empty, and what to try next. */\nexport interface MissDetail {\n /** The fields and operator the match actually used (exact `eq` for resolve, `contains` for search). */\n tried: { fields: string[]; operator: 'eq' | 'contains' };\n /** The blind-surface stamp when the resource's query surface is blind to records the API user does not own. */\n blindSurface?: BlindSurfaceInfo;\n /** Concrete next steps for the caller. */\n next: string[];\n}\n\n/** `resolveWithDetail`: the resolve outcome; `miss` is present only on a miss. */\nexport interface ResolveWithDetail<T> {\n record: T | null;\n resolutionCost: Resolution<T>['resolutionCost'];\n miss?: MissDetail;\n}\n\n/** `searchWithDetail`: the search outcome; `miss` is present only when empty. */\nexport interface SearchWithDetail<T> {\n items: T[];\n miss?: MissDetail;\n}\n\nexport abstract class BaseResource<\n T = Record<string, unknown>,\n TCreate = Record<string, unknown>,\n TUpdate = Record<string, unknown>,\n> {\n protected readonly http: HttpClient;\n protected readonly config: BaseResourceConfig;\n /** Default page size for query walks (the client's resolved `pageSize`). */\n protected readonly defaultPageSize: number;\n\n /** Versioned global URL segment (from the config), e.g. '/V1.0/Companies'. */\n protected get resourcePath(): string {\n return this.config.resourcePath;\n }\n\n /** Parent-scoped template (from the config); undefined for top-level resources. */\n protected get parentScopedPath(): string | undefined {\n return this.config.parentScopedPath;\n }\n\n /** Parent field used to narrow the global query (from the config). */\n protected get parentField(): string | undefined {\n return this.config.parentField;\n }\n\n /** The bounded client-scan caps (section 19.2; resolved per client). */\n protected get resolutionCaps(): ResolutionCaps {\n return this.http.resolution;\n }\n\n constructor(http: HttpClient, config: BaseResourceConfig, pageSize?: number) {\n if (config.key === '' || config.resourcePath === '') {\n throw new AutotaskConfigError('BaseResource requires a non-empty key and resourcePath');\n }\n this.http = http;\n this.config = config;\n this.defaultPageSize = clampPageSize(pageSize ?? DEFAULT_PAGE_SIZE);\n }\n\n // ------------------------------------------------------------------\n // Query walk (wired to the G3 walker; cursor-follow per the pinned wire)\n // ------------------------------------------------------------------\n\n /** One page fetch: page 1 POSTs the QueryModel body; later pages POST the filter to the absolute cursor. */\n protected async fetchPage(params: QueryParams, page: number, pageSize: number, state: QueryWalkState): Promise<Page<T>> {\n const operation = `${this.config.key}.query`;\n if (page === 1) {\n const req = buildQueryRequest(this.http.baseUrl, this.resourcePath, { ...params, maxRecords: pageSize });\n const body = await this.http.request<unknown>({ ...req, operation });\n return this.readPage(body, page, pageSize, state);\n }\n const cursor = state.cursor;\n if (cursor === null) {\n throw new AutotaskError(`No pagination cursor available for page ${page} of ${operation}`, {\n code: 'INVALID_RESPONSE',\n category: 'server',\n operation,\n });\n }\n const conditions = normalizedConditions(params.filter);\n const body: Record<string, unknown> = { filter: conditions === undefined ? [] : buildFilter(conditions).filter };\n const res = await this.http.request<unknown>({\n method: 'POST',\n path: cursorToPath(this.http.baseUrl, cursor),\n body,\n operation,\n idempotent: true,\n });\n return this.readPage(res, page, pageSize, state);\n }\n\n private readPage(body: unknown, page: number, pageSize: number, state: QueryWalkState): Page<T> {\n const { items, pageDetails } = unwrapItems<T>(body, `${this.config.key}.query`);\n state.cursor = pageDetails.nextPageUrl ?? null; // an absent key is no cursor\n // The vendor's nextPageUrl is the continuation signal (node-proven: the walk\n // follows the cursor until it is null; the 1000-page guard caps pathological loops).\n const hasMore = state.cursor !== null;\n return {\n items,\n page,\n pageSize,\n // Verbatim vendor echo of MaxRecords — NOT a match count (live-verified).\n requestCount: pageDetails.requestCount,\n // No vendor total exists: the pages known so far (exact on the last page).\n totalPages: hasMore ? page + 1 : items.length === 0 ? page - 1 : page,\n hasMore,\n };\n }\n\n /** Build the per-walk fetcher (closure keeps cursor state private to this walk). */\n protected pageFetcher(params?: QueryParams): PageFetcher<T> {\n const state: QueryWalkState = { cursor: null };\n const p = params ?? {};\n return (page, pageSize) => this.fetchPage(p, page, pageSize, state);\n }\n\n private walkPageSize(params?: QueryParams): number {\n return clampPageSize(params?.maxRecords ?? this.defaultPageSize);\n }\n\n /** Stream items across pages (the resource `query` surface). */\n protected queryItems(params?: QueryParams): AsyncIterable<T> {\n return paginateItems<T>(this.pageFetcher(params), { pageSize: this.walkPageSize(params) });\n }\n\n /** Stream page objects (the resource `queryPages` surface). */\n protected queryPageIter(params?: QueryParams): AsyncIterable<Page<T>> {\n return paginate<T>(this.pageFetcher(params), { pageSize: this.walkPageSize(params) });\n }\n\n /** Collect every item across all pages (the resource `queryAll` surface; 1000-page guarded). */\n protected async queryAllItems(params?: QueryParams): Promise<T[]> {\n return collectAll<T>(this.pageFetcher(params), { pageSize: this.walkPageSize(params), maxRecords: params?.maxTotalRecords });\n }\n\n /**\n * `queryBounded` — server-side pagination (the MCP query surface): ONE call\n * walks the vendor cursor internally until `limit` TOTAL records are\n * collected or the cursor is exhausted, and returns a bounded,\n * complete-enough result. The client never owns the walk:\n * - `limit` = total records (default 500, hard max 2500 — above it throws\n * AutotaskConfigError; it is NOT a page size). The page-1 request uses\n * the internal page size min(500, limit); follow-up pages POST the\n * preserved filter to the absolute cursor verbatim (the pinned wire:\n * MaxRecords/IncludeFields are baked into the cursor — never changed\n * mid-walk), so the walk reuses `fetchPage` (the shared cursor machinery)\n * with a per-walk closure state (walks never share state).\n * - The 1000-page guard still applies as a SOFT stop: a walk that would\n * fetch a 1001st page stops with `hasMore: true` (never a throw — this\n * is a bounded read, not the `paginate` generator's error path).\n * - `hasMore` = (truncated by limit OR guard) AND (a non-null next cursor\n * was seen at the stop point OR the final page was sliced to meet the\n * limit). Cursor exhausted, or a short/empty page with no truncation →\n * false (never claims more than the cursor + the slice say exist).\n * - `count` is always omitted: `pageDetails.count` is the current page's\n * record count (vendor-documented), never a total — `<resource>.count`\n * is the total.\n * - Issue #59: `latest: N` (validated pre-request, zero wire) delegates to\n * `latestWalk` — the count-anchored N-highest-id mechanism; ABSENT, the\n * walk below is bit-for-bit the existing path.\n * Pure read; no mutation paths involved.\n */\n async queryBounded(params?: BoundedQueryParams): Promise<BoundedQueryResult<T>> {\n if (Array.isArray(params)) {\n throw new AutotaskConfigError(\n 'queryBounded: params must be an object { filter?, limit?, latest?, includeFields? } — a bare conditions array is not accepted (wrap it: { filter: [...] })',\n );\n }\n const limit = params?.limit ?? BOUNDED_QUERY_DEFAULT_LIMIT;\n if (!Number.isInteger(limit) || limit < 1 || limit > BOUNDED_QUERY_MAX_LIMIT) {\n throw new AutotaskConfigError(\n `queryBounded: limit must be an integer 1..${BOUNDED_QUERY_MAX_LIMIT} (got ${String(limit)}) — it is the TOTAL record cap, not a page size`,\n );\n }\n // Issue #61 (slice A): the `noteChars` opt-in — validated pre-request\n // (zero wire); the truncation itself runs at result-build (the\n // single-chokepoint `applyNoteChars` wrap below — response-side only,\n // BEFORE the server-side untrusted wrapper).\n const noteChars = params?.noteChars;\n if (noteChars !== undefined && (!Number.isInteger(noteChars) || noteChars < 1)) {\n throw new AutotaskConfigError(\n `queryBounded: noteChars must be an integer >= 1 (got ${String(noteChars)}) — it is the per-field char cap on the untrusted-class free-text fields (absent = the raw, untruncated result)`,\n );\n }\n // Issue #59: the `latest` opt-in — validated pre-request (zero wire) and\n // delegated to the count-anchored mechanism; the normal path below is\n // bit-for-bit the existing walk when `latest` is absent.\n // Issue #61 (slice B): the `fieldsPreset` opt-in — resolved PRE-WALK to\n // the walk's `includeFields` (the vendor's column selection rides the\n // existing IncludeFields wire path; `id` is always appended by the P1\n // id-append — zero extra wire). The I8 refusals (unknown name /\n // resource mismatch / explicit-includeFields combination) are\n // pre-request, zero wire.\n const walkParams =\n params?.fieldsPreset !== undefined\n ? { ...params, includeFields: resolveFieldsPreset(params.fieldsPreset, this.config.key, params.includeFields) }\n : (params ?? {});\n const latest = walkParams.latest;\n if (latest !== undefined) {\n if (!Number.isInteger(latest) || latest < 1 || latest > BOUNDED_QUERY_MAX_LIMIT) {\n throw new AutotaskConfigError(\n `queryBounded: latest must be an integer 1..${BOUNDED_QUERY_MAX_LIMIT} (got ${String(latest)}) — it is the count of the highest-id rows to return`,\n );\n }\n if (params?.limit !== undefined && limit < latest) {\n throw new AutotaskConfigError(\n `queryBounded: limit (${String(limit)}) must be >= latest (${String(latest)}) — latest governs the returned count and limit is the walk window`,\n );\n }\n // Issue #61 (slice A): the noteChars truncation runs at the SINGLE\n // chokepoint — after EITHER path produced the result, before return.\n return this.applyNoteChars(await this.latestWalk(walkParams, Math.max(limit, latest), latest), noteChars);\n }\n const { items, pages, guard, sliced, cursor } = await this.walkBounded(walkParams, limit);\n const hasMore = (items.length >= limit || guard) && (sliced > 0 || cursor !== null);\n const result: BoundedQueryResult<T> = { items, fetched: items.length, hasMore, pagesWalked: pages };\n this.stampEmptyQueryResult(result, params);\n // Issue #61 (slice A): the same single-chokepoint noteChars wrap (the\n // normal walk path).\n return this.applyNoteChars(result, noteChars);\n }\n\n /** Issue #61 (slice A): the noteChars truncation at the SINGLE chokepoint\n * of `queryBounded` — the normal walk and the `latest` paths both\n * produced their `BoundedQueryResult` here (the single chokepoint the\n * plan pins: R5). Copy-on-truncate (the input records are never\n * mutated); the additive `noteCharsTruncated` stamp = the truncated-\n * field count, ABSENT when 0. The resource's untrusted-class field set\n * is the generated stamp (the SAME plan column the registry's\n * `metadata.untrustedFields` channel stamps — zero second source of\n * truth); an absent set = the cap is a no-op for the resource (bit-for-\n * bit the pre-slice result). */\n private applyNoteChars(result: BoundedQueryResult<T>, noteChars: number | undefined): BoundedQueryResult<T> {\n if (noteChars === undefined) return result;\n const fields = UNTRUSTED_FIELDS_BY_RESOURCE[this.config.key];\n if (fields === undefined || fields.length === 0) return result; // the model has no untrusted-class fields\n const [items, truncated] = truncateNoteChars(result.items, noteChars, fields);\n if (truncated > 0) {\n return { ...result, items, noteCharsTruncated: truncated };\n }\n return result; // nothing truncated — the result is bit-for-bit the pre-slice shape\n }\n\n /** The bounded walk loop (shared by the normal `queryBounded` path and the\n * `latest` modes): walks the vendor cursor until `limit` TOTAL records\n * are collected or the cursor is exhausted; the 1000-page guard is a\n * SOFT stop (never a throw). ONE per-walk closure (walks never share\n * state). */\n private async walkBounded(\n p: QueryParams,\n limit: number,\n ): Promise<{ items: T[]; pages: number; guard: boolean; sliced: number; cursor: string | null }> {\n const state: QueryWalkState = { cursor: null }; // per-walk closure (walks never share state)\n const items: T[] = [];\n let pages = 0;\n let sliced = 0;\n let guard = false;\n const pageSize = Math.min(MAX_PAGE_SIZE, limit);\n for (;;) {\n if (pages >= MAX_PAGES) {\n guard = true; // the 1000-page guard: refuse the 1001st fetch, report hasMore\n break;\n }\n const page = await this.fetchPage(p, pages + 1, pageSize, state);\n pages += 1;\n const remaining = limit - items.length;\n const take = page.items.slice(0, remaining);\n sliced += Math.max(0, page.items.length - remaining);\n items.push(...take);\n if (items.length >= limit) break; // the limit was met (possibly mid-page)\n if (!page.hasMore || page.items.length === 0) break; // cursor exhausted (or a short empty page ends the walk, like paginate)\n }\n return { items, pages, guard, sliced, cursor: state.cursor };\n }\n\n /** A walk stop is TRUNCATED when the 1000-page guard fired, or the limit\n * was met with a live next cursor (or a sliced final page): rows exist\n * past the stop point, and a top-N-by-id over the collected set alone is\n * unprovable (the `latest` mechanism refuses instead of guessing). */\n private walkTruncated(\n limit: number,\n stop: { itemsLength: number; guard: boolean; sliced: number; cursor: string | null },\n ): boolean {\n return stop.guard || (stop.itemsLength >= limit && (stop.sliced > 0 || stop.cursor !== null));\n }\n\n /** The 0-item result stamping — the ONE source of truth (the normal walk\n * and the `latest` empty outcome both ride it): the typed blind-surface\n * sentinel + the pinned empty-reason, through the filter-aware predicate\n * `blindStampFor` (`unfiltered-blind` surfaces stamp ONLY the unfiltered\n * call — a filtered empty result is a true absence; live-verified\n * S12-B P1: the filtered tickets.query returns data on ww29). Additive:\n * the walk values are never mutated. The PINNED reason is filter-aware\n * like the blind stamps (post-verification F1): a FILTERED empty walk on\n * a pinned surface is a true absence in that filter's scope, never a\n * tenant-scope claim — the pin states \"EMPTY FOR THIS API USER\" across\n * the whole surface, which a filter-scope 0 does not establish (no\n * speculation). */\n private stampEmptyQueryResult(result: BoundedQueryResult<T>, params: BoundedQueryParams | undefined): void {\n if (result.items.length !== 0) return;\n result.blindSurface = blindStampFor(BLIND_SURFACE_STAMPS[this.config.key]?.query, params?.filter);\n // Issue #14: the typed empty-reason (the SAME source as the sentinel —\n // the blind pin synthesizes the `blind-surface` reason; a plan-pinned\n // empty-for-user surface rides its reason directly).\n const pinnedReason =\n normalizedConditions(params?.filter) === undefined\n ? EMPTY_REASON_STAMPS[this.config.key]?.query\n : undefined;\n if (result.blindSurface !== undefined || pinnedReason !== undefined) {\n result.emptyReason =\n result.blindSurface !== undefined ? blindEmptyReason(result.blindSurface) : pinnedReason;\n }\n }\n\n /** Issue #59: id comparison honouring the Identifier contract (safe\n * numbers numerically; exact-digit strings via `BigInt`; mixed\n * number/string via `BigInt(String(a))`) — ids above 2^53 stay exact. */\n private compareIds(a: Identifier, b: Identifier): number {\n if (typeof a === 'number' && typeof b === 'number') return a < b ? -1 : a > b ? 1 : 0;\n const bigA = typeof a === 'number' ? BigInt(String(a)) : BigInt(a);\n const bigB = typeof b === 'number' ? BigInt(String(b)) : BigInt(b);\n return bigA < bigB ? -1 : bigA > bigB ? 1 : 0;\n }\n\n /** Issue #59: one `latest` threshold count probe — a ROWLESS\n * `count(F ∧ id gt T)` call (the vendor caps — ≤500 OR-conditions,\n * 8000 chars serialised — leave a single `gt` condition room on any\n * filter). The `BlindCountResult` sentinel (a record, not a number —\n * the declared `number` return is the documented under-type) unwraps to\n * its `count` value (always 0): at or above the max matching id the\n * count is 0, which is exactly the bracket-termination signal. */\n private async countAboveId(baseConds: FilterCondition[], t: bigint): Promise<number> {\n // The threshold rides the wire as a JSON number while it is exactly\n // representable (<= 2^53); beyond that the canonical digit STRING is\n // the Identifier contract's only exact form (a JS number that big has\n // already lost precision).\n const value: FilterValue = t <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(t) : t.toString();\n const res = await this.countGlobal({ filter: [...baseConds, { op: 'gt', field: 'id', value }] });\n return typeof res === 'object' && res !== null && 'count' in res ? (res as { count: number }).count : (res as number);\n }\n\n /**\n * Issue #59: the `latest: N` mechanism — the N highest-`id` rows,\n * count-anchored (the vendor has no sort parameter; `id` is the primary\n * key, so \"highest id\" is the only order the SDK can prove). Three\n * branches:\n * 1. PROBE: `C = count(F)` — ONE rowless count call. A\n * `BlindCountResult` sentinel (a record, not a number) routes to\n * branch 3; a plain number to branch 2.\n * 2. NON-BLIND:\n * - `C === 0` → the stamped empty (1 wire total — the 0-item stamping\n * reused; a pinned `emptyReason` where the plan pins one).\n * - `C <= 2500` → FULL-SET mode: the bounded walk of `F` (limit `C`,\n * page size min(500, C)) collects the COMPLETE matching set — wire\n * 1 + ceil(C/500) <= 6, independent of table size. A truncated walk\n * (the vendor's rows disagree with its own count) is\n * LATEST_WINDOW_INCOMPLETE — the top-N of a truncated set is\n * unprovable. Sort id-descending; return the top N (a set of\n * C < N returns itself).\n * - `C > 2500` → THRESHOLD mode: find the smallest id threshold `T`\n * with `count(F ∧ id gt T) <= N` by exponential bracketing\n * (T = 1, 2, 4, …) + binary search — each probe ONE rowless count\n * call, the total budget LATEST_MAX_COUNT_PROBES (exhaustion →\n * LATEST_THRESHOLD_UNRESOLVED; worst case 1 + 2·log2(maxId)). The\n * window {F ∧ id gte T} holds exactly N+1 rows: `T` is the SMALLEST\n * threshold with count <= N, so `count(F ∧ id gt (T-1)) > N`, and\n * `count(gt (T-1)) = count(gt T) + count(eq T)` forces a matching\n * row with `id == T` (ids are unique primary keys) — every row\n * outside the window has a lower id, so the N highest of the window\n * ARE the N highest overall. Final step: ONE bounded walk of the\n * window (limit N+1, ≤ 6 pages), sort id-descending, take N.\n * `hasMore: false` — complete FOR THE REQUEST (the table may hold\n * more rows; `<resource>.count` is the total).\n * 3. BLIND: the count cannot be trusted (a blind 0 proves nothing) → the\n * bounded walk of `F` up to `limit` (default 500). A completing walk\n * (cursor exhausted within the limit) returns the sorted top-N WITH\n * the blind-surface sentinel stamp — the \"highest id\" claim is scoped\n * to the caller-visible enumeration (the one new stamp usage: the\n * normal path stamps only 0-item results). A truncated walk (the limit\n * reached with a live next cursor, or the 1000-page guard) →\n * LATEST_WINDOW_INCOMPLETE — a truncated enumeration's top-N-by-id is\n * unprovable, so the op refuses instead of returning a possibly-wrong\n * answer.\n * `includeFields` always carries `id` (the P1 id-append,\n * `buildQueryRequest`), which `latest` sorts on. Pure read; no mutation\n * paths involved.\n */\n private async latestWalk(params: BoundedQueryParams, limit: number, latest: number): Promise<BoundedQueryResult<T>> {\n const baseConds: FilterCondition[] = normalizedConditions(params.filter) ?? [];\n // 1. Probe (ONE wire call). The sentinel is a RECORD (the declared\n // `number` return is the documented under-type, pinned by\n // test/resources/blind-surface.test.ts).\n const probe = await this.countGlobal(params);\n if (typeof probe === 'object' && probe !== null) {\n const rec = probe as { count: number; blindSurface?: BlindSurfaceInfo };\n if (rec.blindSurface !== undefined) {\n // The BLIND sentinel (a blind 0 proves nothing) — branch 3.\n return this.latestBlindWalk(params, limit, latest);\n }\n // The pinned-empty record (count 0 + the pinned empty-reason, no blind\n // sentinel — the non-blind plan-pinned empty surfaces): the count IS\n // 0, so the stamped-empty branch (the 0-item stamping re-derives the\n // SAME pinned reason — one source of truth). 1 wire total.\n const result: BoundedQueryResult<T> = { items: [], fetched: 0, hasMore: false, pagesWalked: 0 };\n this.stampEmptyQueryResult(result, params);\n return result;\n }\n const total = probe as number;\n if (total === 0) {\n const result: BoundedQueryResult<T> = { items: [], fetched: 0, hasMore: false, pagesWalked: 0 };\n this.stampEmptyQueryResult(result, params); // 1 wire total\n return result;\n }\n if (total <= BOUNDED_QUERY_MAX_LIMIT) {\n // Full-set mode: a complete walk of the (small) matching set.\n const { items, pages, guard, sliced, cursor } = await this.walkBounded(params, total);\n if (this.walkTruncated(total, { itemsLength: items.length, guard, sliced, cursor })) {\n throw this.latestWindowIncompleteError(total); // the vendor's rows disagree with its count\n }\n return this.finishLatest(items, latest, pages);\n }\n // Threshold mode: exponential bracketing + binary search — ONE rowless\n // count call per probe, the total budget LATEST_MAX_COUNT_PROBES (the\n // initial count is probe 1).\n let probes = 1;\n const spend = (): void => {\n probes += 1;\n if (probes > LATEST_MAX_COUNT_PROBES) throw this.latestThresholdUnresolvedError();\n };\n let lo = 0n; // f(lo) > N (f(0) = the rows above id 0 — the C > 2500 > N entry)\n let hi = 0n; // the first T with f(T) <= N\n for (let t = 1n; ; t = t << 1n) {\n spend();\n if ((await this.countAboveId(baseConds, t)) <= latest) {\n hi = t;\n break;\n }\n lo = t;\n }\n while (hi - lo > 1n) {\n const mid = (lo + hi) >> 1n;\n spend();\n if ((await this.countAboveId(baseConds, mid)) <= latest) hi = mid;\n else lo = mid;\n }\n // The window {F ∧ id gte T}: one bounded walk (limit N+1), sorted\n // id-descending, take N. The threshold value rides the wire exactly as\n // the probes did (number while <= 2^53, canonical digits beyond).\n const windowValue: FilterValue =\n hi <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(hi) : hi.toString();\n const window: FilterCondition[] = [...baseConds, { op: 'gte', field: 'id', value: windowValue }];\n const { items, pages, guard, sliced, cursor } = await this.walkBounded({ ...params, filter: window }, latest + 1);\n if (this.walkTruncated(latest + 1, { itemsLength: items.length, guard, sliced, cursor })) {\n throw this.latestWindowIncompleteError(latest + 1); // the window holds more than the counts said\n }\n return this.finishLatest(items, latest, pages);\n }\n\n /** The shared `latest` completion: the (provably complete or\n * stamp-scoped) set sorted id-descending, top N taken. `hasMore: false`\n * — the result is complete FOR THE REQUEST (the table may hold more\n * rows; `<resource>.count` is the total). */\n private finishLatest(items: T[], latest: number, pages: number): BoundedQueryResult<T> {\n items.sort((a, b) => this.compareIds((b as { id: Identifier }).id, (a as { id: Identifier }).id)); // id-descending\n const top = items.slice(0, latest);\n return { items: top, fetched: top.length, hasMore: false, pagesWalked: pages };\n }\n\n /** The blind branch of `latestWalk` (branch 3): the bounded walk of `F`\n * up to `limit` (default 500) + the id-descending top-N. A completing\n * walk (cursor exhausted within the limit) is stamped with the\n * blind-surface sentinel — the \"highest id\" claim is scoped to the\n * caller-visible enumeration (the note says exactly that; the one new\n * stamp usage, the normal path stamps only 0-item results); a truncated\n * walk is LATEST_WINDOW_INCOMPLETE. */\n private async latestBlindWalk(\n params: BoundedQueryParams,\n limit: number,\n latest: number,\n ): Promise<BoundedQueryResult<T>> {\n const { items, pages, guard, sliced, cursor } = await this.walkBounded(params, limit);\n if (this.walkTruncated(limit, { itemsLength: items.length, guard, sliced, cursor })) {\n throw this.latestWindowIncompleteError(limit); // a truncated enumeration's top-N-by-id is unprovable\n }\n const result = this.finishLatest(items, latest, pages);\n if (result.items.length === 0) {\n this.stampEmptyQueryResult(result, params);\n } else {\n // Filter-aware predicate: `unfiltered-blind` surfaces stamp only the\n // unfiltered call — a filtered top-N is a true in-scope answer.\n result.blindSurface = blindStampFor(BLIND_SURFACE_STAMPS[this.config.key]?.query, params.filter);\n }\n return result;\n }\n\n /** Issue #59: the typed refusal when the id-threshold probe budget is\n * exhausted — the NEW code is an addition to the served error-code\n * surface (docs/API.md §2; no new class — the `errorCodes` baseline is\n * untouched). Zero wire beyond the probes. */\n private latestThresholdUnresolvedError(): AutotaskConfigError {\n return new AutotaskConfigError(\n `queryBounded latest: the id-threshold count probes exhausted the ${LATEST_MAX_COUNT_PROBES}-call budget without resolving a window — the N highest-id rows cannot be proven from the counts alone`,\n {\n code: 'LATEST_THRESHOLD_UNRESOLVED',\n category: 'policy',\n suggestedAction:\n 'Narrow with a date window in `filter` (or a smaller `latest`) so the matching set fits the 2500-row full-set mode.',\n },\n );\n }\n\n /** Issue #59: the typed refusal when a `latest` walk truncates — the NEW\n * code is an addition to the served error-code surface (docs/API.md\n * §2). A truncated enumeration's top-N-by-id is unprovable, so the op\n * refuses instead of returning a possibly-wrong answer. */\n private latestWindowIncompleteError(walkLimit: number): AutotaskConfigError {\n return new AutotaskConfigError(\n `queryBounded latest: the walk truncated at the ${walkLimit}-row stop (a live next cursor at the stop, or the 1000-page guard) — a truncated enumeration's top-N-by-id is unprovable`,\n {\n code: 'LATEST_WINDOW_INCOMPLETE',\n category: 'policy',\n suggestedAction: 'Narrow with a date-window `filter` so the visible set fits the limit.',\n },\n );\n }\n\n // ------------------------------------------------------------------\n // Count\n // ------------------------------------------------------------------\n\n /** `POST /V1.0/<E>/query/count` → `queryCount` unwrapped to a plain number —\n * or, on a plan-pinned blind surface, the `{ count: 0, blindSurface }`\n * typed sentinel (S12-C T10; see `BlindCountResult`). */\n protected async countGlobal(params?: QueryParams): Promise<number> {\n const conditions = normalizedConditions(params?.filter);\n const body: Record<string, unknown> = {};\n // ALWAYS send a `filter` field — node parity: the n8n node defaults the\n // count filter to `{ filter: [] }` (executeCount in base-operation.ts).\n // Some zone API versions NRE on a missing filter field (live-verified\n // 2026-10-01 against the AU03/ww29 tenant: 500 `{\"errors\":[\"Value\n // cannot be null. Parameter name: filters\"]}`); an empty array is the\n // vendor-accepted no-filter shape (the swagger marks it optional, the\n // live zone does not).\n body.filter = conditions === undefined ? [] : buildFilter(conditions).filter;\n const res = await this.http.request<unknown>({\n method: 'POST',\n path: `${this.resourcePath}/query/count`,\n body,\n operation: `${this.config.key}.count`,\n idempotent: true,\n });\n const count = unwrapQueryCount(res, `${this.config.key}.count`);\n // S12-C (T10): the typed blind-surface sentinel (plan pin: the served\n // `count` op takes no filter arg — a 0 on a plan-pinned surface is always\n // the blind shape, so it is always stamped). Additive +\n // classification-neutral: a non-zero count returns the plain number;\n // the sentinel only replaces a 0 and its `count` value is that same 0.\n // The declared `number` return is a deliberate under-type: the 116\n // generated concrete `count()` methods declare `Promise<number>` and\n // S12-C touches base.ts only (the runtime union is `BlindCountResult`,\n // pinned by test/resources/blind-surface.test.ts).\n // Post-merge P1: the SAME filter-aware predicate as the query wrap —\n // the vendor count takes the same filter shape, so a FILTERED count=0\n // on an `unfiltered-blind` surface is a true absence, never a sentinel.\n const stamp = blindStampFor(BLIND_SURFACE_STAMPS[this.config.key]?.count, params?.filter);\n if (count === 0) {\n // Issue #14: the typed empty-reason channel. The blind pin synthesizes\n // the `blind-surface` reason (the sentinel's byte-identical note); a\n // plan-pinned empty-for-user surface (no blind pin) rides its reason\n // directly. Additive + classification-neutral: the count value is that\n // same 0 — the reason only replaces the plain 0 in the pinned cases.\n // The pinned reason is filter-aware (post-verification F1): a FILTERED\n // count=0 on a pinned surface is a true absence in that scope, never\n // the tenant-scope claim the pin makes — the pin rides only the\n // unfiltered call (the same predicate as the blind stamps).\n const pinnedReason =\n conditions === undefined ? EMPTY_REASON_STAMPS[this.config.key]?.count : undefined;\n if (stamp !== undefined || pinnedReason !== undefined) {\n return {\n count,\n ...(stamp !== undefined ? { blindSurface: stamp } : {}),\n emptyReason: stamp !== undefined ? blindEmptyReason(stamp) : pinnedReason,\n } as unknown as number;\n }\n }\n return count;\n }\n\n // ------------------------------------------------------------------\n // Single-record reads\n // ------------------------------------------------------------------\n\n /** Single-record GET through the read cache (issue #80: default-on; with\n * `cache: false` this is exactly one `http.request` — the bit-for-bit\n * uncached path). Only the successful\n * (already redacted) body is stored — errors throw before `set`.\n * `fresh` skips the lookup (the read still refreshes the entry for the\n * other callers): mutation-path reads (stale-object guard, dry-run diff)\n * and the composite ROOT read of a hot resource (issue #36 — the\n * ticket-composite root) must see the live record, never a snapshot.\n * `resource` (issue #32) is the plan key of the entity this path\n * points to: the stored entry's TTL is the per-resource override for\n * that key when `cache.perResourceTtlMs` names it, else `ttlMs`. */\n private async cachedGet(path: string, operation: string, fresh = false, resource?: string): Promise<unknown> {\n const cache = this.http.readCache;\n if (cache !== undefined && !fresh) {\n const hit = cache.get(path);\n if (hit !== undefined) return hit;\n }\n const epoch = cache?.epoch;\n const res = await this.http.request<unknown>({ method: 'GET', path, operation });\n cache?.set(path, res, resource, epoch);\n return res;\n }\n\n /**\n * Entity-metadata read through the opt-in field cache (issue #31; off by\n * default: with no fieldCache this is exactly one `http.request` — the\n * bit-for-bit uncached trio path). One private helper beside `cachedGet`,\n * for the same three reasons the read cache exists: a vendor drift\n * (deterministic 500, INVALID_RESPONSE) must not be served stale, repeat\n * reads must not pay the wire, and concurrent callers must not issue\n * duplicate requests. The UNWRAPPED value is stored (never the raw\n * envelope); an EMPTY or FAILED result is never cached (a failure\n * rejects before any `set`; an empty is refused by the cache itself);\n * concurrent callers share ONE in-flight wire request; the drift signal\n * (the INVALID_RESPONSE shape drift, the deterministic validation 500)\n * invalidates THIS entity's entries so the next call refetches\n * (transport-level signals are also invalidated in the transport's own\n * catch — the two sites cover the 2xx and non-2xx halves). `fresh`\n * skips the lookup: fetch live and refresh the entries.\n */\n private async cachedMeta<T>(\n kind: FieldCacheKind,\n path: string,\n operation: string,\n unwrap: (body: unknown) => T,\n fresh = false,\n ): Promise<T> {\n const cache = this.http.fieldCache;\n if (cache === undefined) {\n const res = await this.http.request<unknown>({ method: 'GET', path, operation });\n return unwrap(res);\n }\n const key = this.config.key;\n if (!fresh) {\n const shared = cache.inflight(key, kind);\n if (shared !== undefined) return shared as Promise<T>;\n const hit = cache.get(key, kind);\n if (hit !== undefined) return hit as T;\n }\n const work = this.http\n .request<unknown>({ method: 'GET', path, operation })\n .then((body) => {\n const value = unwrap(body);\n cache.set(key, kind, value); // a no-op for an empty value (never cached)\n return value;\n });\n // The drift signal: a rejection (the INVALID_RESPONSE shape drift, the\n // deterministic validation 500) drops this entity's entries — the next\n // call refetches. A failure is never cached (the promise rejects; the\n // in-flight entry is dropped on settle).\n work.catch((err: unknown) => {\n if (err instanceof AutotaskError && (err.code === 'INVALID_RESPONSE' || err.details?.deterministic === true)) {\n cache.invalidate(key);\n }\n });\n return cache.track(key, kind, work) as Promise<T>;\n }\n\n /** `GET /V1.0/<E>/{id}` → `{ item }` unwrapped (`item: null` → NotFoundError). */\n protected async getGlobal(id: Identifier, fresh = false): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.cachedGet(`${this.resourcePath}/${numeric}`, `${this.config.key}.get`, fresh, this.config.key);\n return unwrapItem<T>(res, numeric, `${this.config.key}.get`);\n }\n\n /**\n * V2 merge read: a FRESH single-record GET that skips response redaction\n * (the `skipResponseRedaction` transport flag). The merge round-trips the\n * record's own current values back to the same vendor endpoint in the\n * confirmed PUT — redacting this read would write literal '[REDACTED]'\n * markers into the merged body (corruption on live records; the caller\n * never sees the values: the PUT answers `{ id }`, and the request-body\n * audit keeps logging redacted). Never cached: mutation-path reads must\n * see the live record, and an unredacted body must not enter the\n * (redacted-view) read cache.\n */\n protected async getGlobalUnredacted(id: Identifier): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.http.request<unknown>({\n method: 'GET',\n path: `${this.resourcePath}/${numeric}`,\n operation: `${this.config.key}.get`,\n skipResponseRedaction: true,\n });\n return unwrapItem<T>(res, numeric, `${this.config.key}.get`);\n }\n\n /**\n * Issue #34 fallback merge read: a FRESH parent-scoped single-record GET\n * that skips response redaction and is never cached (the same invariants\n * as `getGlobalUnredacted`, on the scoped item path — the spec's readable\n * route for parent-scoped children). The merged retry body round-trips the\n * record's own current values: a redacted read would write literal\n * '[REDACTED]' markers into the fallback PUT (corruption on live records).\n */\n protected async getScopedUnredacted(parentId: Identifier, id: Identifier): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.http.request<unknown>({\n method: 'GET',\n path: this.scopedItemPath(parentId, numeric),\n operation: `${this.config.key}.get`,\n skipResponseRedaction: true,\n });\n return unwrapItem<T>(res, numeric, `${this.config.key}.get`);\n }\n\n /** Parent-scoped `GET .../{parentId}/<Child>/{id}` → `{ item }` unwrapped. */\n protected async getScopedRaw(parentId: Identifier, id: Identifier, fresh = false): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);\n return unwrapItem<T>(res, numeric, `${this.config.key}.get`);\n }\n\n /**\n * Attachment single-read: the vendor answers the model DIRECTLY (swagger),\n * while the node observed `{ items: [model] }` for some attachment GETs —\n * accept all three shapes; empty/null → NotFoundError.\n */\n protected async getScopedModel(parentId: Identifier, id: Identifier, fresh = false): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);\n return this.unwrapModelLike<T>(res, numeric);\n }\n\n private unwrapModelLike<U>(body: unknown, id: Identifier): U {\n if (!isRecord(body)) {\n throw new AutotaskError(\n `Expected an attachment model (or { item } / { items }) envelope for ID ${id}; got a different shape`,\n { code: 'INVALID_RESPONSE', category: 'server', resourceIds: [id] },\n );\n }\n // FULL100 F5: the vendor's 200 empty-object miss shape (the global\n // attachment item path answers missing ids 200 + `{}`) is a TYPED miss —\n // a miss is never a bare zero (the S12-E2E D1 contract).\n if (Object.keys(body).length === 0) {\n throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });\n }\n if ('item' in body) return unwrapItem<U>(body, id);\n if (Array.isArray(body.items)) {\n const first = body.items[0];\n if (first === null || first === undefined) {\n throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });\n }\n return first as U;\n }\n return body as U;\n }\n\n // ------------------------------------------------------------------\n // Mutations\n // ------------------------------------------------------------------\n\n /** Normalise a mutation body: `id` OR `itemId` → `id`; UDF map → UDF array (UDF-capable only). */\n protected normalizeMutationBody(data: Record<string, unknown>): Record<string, unknown> {\n const body: Record<string, unknown> = { ...data };\n if (body.itemId !== undefined && body.id === undefined) {\n body.id = body.itemId;\n delete body.itemId;\n }\n if (this.config.udfCapable && body.userDefinedFields !== undefined) {\n body.userDefinedFields = normalizeUdfInput(body.userDefinedFields);\n }\n return body;\n }\n\n /** `POST /V1.0/<E>` → `{ id }` (issue #13: a drifted 2xx runs the bounded marker recovery where the plan pins a marker field). */\n protected async createGlobal(data: TCreate, opts: CreateOpts = {}): Promise<OperationResult> {\n const body = this.normalizeMutationBody(data as Record<string, unknown>);\n const res = await this.http.request<unknown>({\n method: 'POST',\n path: this.resourcePath,\n body,\n operation: `${this.config.key}.create`,\n });\n return this.unwrapCreateOperation(res, body, opts);\n }\n\n /**\n * Issue #13: the create-response envelope unwrap with the bounded marker\n * recovery. The fast path is the plain `unwrapOperation` (a well-formed\n * envelope costs ZERO extra requests and returns the byte-identical\n * `{ id }` result). Only a typed `INVALID_RESPONSE` (a 2xx body that is\n * not the specced envelope / `{ id }` / `{ itemId }` alternative) with a\n * plan-pinned marker field AND `recoverIdFromMarker !== false` runs the\n * fallback — and it can only run on the APPLY path: a dry run returns the\n * pinned envelope BEFORE the mutating request, so the fallback never sees\n * a dry-run response (skipped entirely by construction).\n */\n private async unwrapCreateOperation(body: unknown, wireBody: Record<string, unknown>, opts: CreateOpts): Promise<OperationResult> {\n const operation = `${this.config.key}.create`;\n try {\n return unwrapOperation(body, operation);\n } catch (err) {\n if (!isAutotaskError(err) || err.code !== 'INVALID_RESPONSE') throw err;\n const pin = RESPONSE_DRIFT_MARKERS[this.config.key];\n if (pin === undefined || opts.recoverIdFromMarker === false) throw err;\n return this.recoverCreatedIdByMarker(err, body, wireBody, opts, pin);\n }\n }\n\n /**\n * Issue #13: the ONE bounded marker read on the resource's own query\n * surface (`POST <collection>/query`, MaxRecords 5 — a read: idempotent,\n * zero mutating wire; the fallback never issues anything else). Outcomes:\n * exactly ONE numeric match → the normal success result stamped\n * `idFrom: 'marker-recovery'` + the `shapeDrift` note; zero matches, more\n * than one, or a cap-tripped search (a full 5 + a next cursor) → the\n * existing `INVALID_RESPONSE` with the drift detail + the failed search\n * (candidate ids listed — never a guessed id).\n */\n private async recoverCreatedIdByMarker(\n err: AutotaskError,\n body: unknown,\n wireBody: Record<string, unknown>,\n opts: CreateOpts,\n pin: (typeof RESPONSE_DRIFT_MARKERS)[string],\n ): Promise<OperationResult> {\n const operation = `${this.config.key}.create`;\n const markerField = typeof opts.markerField === 'string' && opts.markerField.trim() !== '' ? opts.markerField.trim() : pin.markerField;\n const markerToken =\n typeof opts.markerToken === 'string' && opts.markerToken.trim() !== '' ? opts.markerToken.trim() : defaultMarkerToken(wireBody);\n if (markerToken === null) throw err; // nothing to search — the typed error stands unchanged\n const observedShape = describeResponseShape(body);\n const res = await this.http.request<unknown>({\n method: 'POST',\n idempotent: true,\n path: `${this.resourcePath}/query`,\n body: { MaxRecords: MARKER_RECOVERY_LIMIT, filter: [{ field: markerField, op: 'contains', value: markerToken }] },\n operation: `${operation}.marker-recovery`,\n });\n const { items, pageDetails } = unwrapItems<Record<string, unknown>>(res, operation);\n const truncated = items.length >= MARKER_RECOVERY_LIMIT && pageDetails.nextPageUrl != null;\n const drift: Record<string, unknown> = {\n observedShape,\n speccedEnvelope: 'OperationResultModel',\n markerField,\n markerToken,\n matches: items.length,\n truncated,\n note: pin.note,\n };\n const numericIds = items.map((row) => {\n const id = row.id;\n if (typeof id === 'number' && Number.isInteger(id) && id >= 0) return id;\n if (typeof id === 'string' && /^\\d+$/.test(id.trim())) {\n const parsed = Number.parseInt(id.trim(), 10);\n // An all-digit string beyond the safe range keeps its exact digits\n // (the string form is the only lossless carrier for vendor ids\n // above 2^53 — never re-parse to a corrupted number).\n return Number.isSafeInteger(parsed) ? parsed : id.trim();\n }\n return null;\n });\n if (items.length === 1 && !truncated && numericIds[0] !== null) {\n const id = numericIds[0] as Identifier;\n const shapeDrift: OperationShapeDrift = {\n observedShape,\n speccedEnvelope: 'OperationResultModel',\n note: `The create answered 2xx with a body that is not the specced OperationResultModel (observed: ${observedShape}); the id was recovered by ONE bounded marker read (${markerField} contains the caller's marker, limit ${MARKER_RECOVERY_LIMIT}) — exactly one numeric match.`,\n };\n return { id, idFrom: 'marker-recovery', shapeDrift };\n }\n // Zero / multiple / truncated: the existing code + the drift detail (never a guessed id).\n const candidateIds = numericIds.map((n, i) => n ?? String(items[i]!.id ?? 'unknown'));\n const outcome = items.length === 0 ? 'found 0 matches' : truncated ? `found ${items.length} matches at the limit ${MARKER_RECOVERY_LIMIT} cap (truncated — more may exist)` : `found ${items.length} matches`;\n err.details = { ...err.details, responseDrift: { ...drift, candidateIds } };\n err.suggestedAction =\n `The create answered 2xx with a body that is not the specced OperationResultModel (observed shape: ${observedShape}); ` +\n `the bounded marker recovery (${markerField} contains the caller's marker, limit ${MARKER_RECOVERY_LIMIT}) ${outcome} — ` +\n (items.length === 0\n ? 'the record may exist with an unfindable marker; report the vendor response-shape drift and locate the record in the UI.'\n : 'refusing to guess an id — disambiguate with an exact-field query (or the UI) and recover the id before retrying.');\n throw err;\n }\n\n /** `PUT /V1.0/<E>/{id}` (the vendor tolerates PATCH at the same path) → `{ id }`.\n * For collection-only-writable resources (`collectionUpdate`, D1) the\n * vendor spec defines no put/patch on the item path (it is GET-only; the\n * item-path PUT 405s), so the confirmed update hits the COLLECTION\n * `PUT /V1.0/<E>` with the record id merged into the mutation body — the\n * vendor keys the record by the id in the body (the same convention the\n * parent-scoped `updateScopedRaw` PATCH uses).\n *\n * V2 partial-update merge: the vendor's collection PUT validates the FULL\n * model (a partial body 500s 'Missing Required Field'), so a\n * collectionUpdate update MERGES the caller's partial body into the\n * record's current full model before the PUT: ONE fresh GET serves both\n * the merge source and the stale-object guard's read (a `lastModifiedDate`\n * mismatch throws STALE_OBJECT before the PUT; the guard semantics are\n * unchanged — it is a no-op where the model lacks the field or the caller\n * supplied no token). `opts.raw === true` sends the caller body as-is\n * instead (the pre-merge wire; the guard keeps its own verification read\n * when a token is supplied).\n *\n * Issue #34: with `update.putFallback: true` (OFF by default), a TYPED\n * 404 on the pinned route retries ONCE as `PUT /{Entity}/{id}` where the\n * gate holds — never a collectionUpdate route (the spec defines no\n * item-path update there), never a `raw: true` update, never a non-404\n * fault; the retry body runs the same fresh-read merge (see\n * `putFallbackMergedBody`), so the fallback is never a null-clearing\n * partial. A declined gate (a collectionUpdate route 404s, or the retry\n * itself 404s) throws the self-explaining typed error (the route tried,\n * the status, the opt-in; `details.putFallback`). */\n /**\n * Issue #34 gate: the fallback may fire only while `update.putFallback`\n * is ON and the pinned update route answered a TYPED 404 (a transport\n * `NotFoundError` with `httpStatus: 404`) — never a 400/405/422/5xx, and\n * never a 2xx shape fault (those keep today's typed error byte-identical).\n */\n private putFallbackEligible(err: unknown): err is AutotaskError {\n // Class-keyed, not code-keyed: a 404 body carrying a machine-like vendor code\n // ADOPTS it into `err.code` (the errors.ts adoption rule), but the transport\n // class identity holds — the opt-in recovery must not be skippable by a body.\n return this.http.update.putFallback === true && err instanceof NotFoundError && err.httpStatus === 404;\n }\n\n /**\n * Issue #34: the fallback retry body — the caller's (normalised) fields\n * merged onto a FRESH unredacted read of the current record (the same\n * merge the collection-update path performs; the read is the live record,\n * never cached). A target miss on the merge read surfaces with the pinned\n * update-target reason (the issue-#14 convention) — the recovery has\n * nothing to merge onto, and no retry is issued.\n */\n private async putFallbackMergedBody(\n read: () => Promise<unknown>,\n callerBody: Record<string, unknown>,\n id: Identifier,\n ): Promise<Record<string, unknown>> {\n let current: unknown;\n try {\n current = await read();\n } catch (err) {\n if (err instanceof NotFoundError) attachUpdateTargetMissReason(err, this.config.key);\n throw err;\n }\n const merged = mergePartialBody(current as Record<string, unknown>, callerBody);\n merged.id = id; // the record is keyed by the id (re-asserted after the merge)\n return merged;\n }\n\n /**\n * Issue #34: the self-explaining typed error a DECLINED gate throws. The\n * original transport error keeps its identity (class / code / httpStatus);\n * the message names the route tried, the status and the opt-in, and the\n * structured detail rides under `details.putFallback`\n * (`{ route, status, retried, optIn }`).\n */\n private putFallbackDeclined(err: AutotaskError, route: string, retried: boolean): AutotaskError {\n err.message =\n `${route} answered 404 on the pinned update route; ` +\n (retried\n ? `the update.putFallback retry ${route} also answered 404 — the zone drops the item route as well, so no further recovery is possible`\n : `the opt-in update.putFallback declines to retry this route (collectionUpdate resources have no spec-defined item-path update; raw updates send exactly what they were told) — no fallback was issued`);\n err.details = { ...(err.details ?? {}), putFallback: { route, status: 404, retried, optIn: 'update.putFallback' } };\n err.suggestedAction = retried\n ? 'The zone answers 404 for both the pinned update route and the item route — verify the zone route registration for this entity before retrying.'\n : 'The zone drops the pinned update route and the spec defines no item-path update for this resource — verify the zone route registration, or issue the update against the collection route raw.';\n return err;\n }\n\n protected async updateGlobal(\n id: Identifier,\n data: TUpdate,\n opts: MutationOpts = {},\n ): Promise<OperationResult> {\n const numeric = parseIdentifier(id, 'id');\n const operation = `${this.config.key}.update`;\n let body = this.normalizeMutationBody(data as Record<string, unknown>);\n const collectionUpdate = this.config.collectionUpdate === true;\n if (collectionUpdate) {\n if (opts.raw !== true) {\n // The merge: one read doubles as the guard's read (never the cache —\n // a mutation-path read must see the live record). The read skips\n // response redaction (getGlobalUnredacted): the merged PUT body must\n // carry the record's own true current values, never '[REDACTED]'\n // markers (the values round-trip to the same vendor endpoint only).\n // Issue #14: a target miss on the UPDATE's own merge read carries\n // the pinned update-row reason (the generic .get not-found reason\n // the transport attached does not explain an UPDATE miss).\n let current: Record<string, unknown>;\n try {\n current = (await this.getGlobalUnredacted(numeric)) as unknown as Record<string, unknown>;\n } catch (err) {\n if (err instanceof NotFoundError) attachUpdateTargetMissReason(err, this.config.key);\n throw err;\n }\n this.staleObjectCheck(current, opts, operation);\n body = mergePartialBody(current, body);\n } else {\n // Raw: the caller's body goes out as-is (no merge). The stale guard\n // keeps today's semantics (its own read only when a token is given).\n await this.guardStaleBeforeMutation(numeric, opts, operation);\n }\n body.id = numeric; // the record is keyed by the id in the body\n }\n const route = collectionUpdate ? `PUT ${this.resourcePath}` : `PUT ${this.resourcePath}/${numeric}`;\n let res: unknown;\n try {\n res = await this.http.request<unknown>({\n method: 'PUT',\n path: collectionUpdate ? this.resourcePath : `${this.resourcePath}/${numeric}`,\n body,\n operation,\n });\n } catch (err) {\n if (!this.putFallbackEligible(err)) throw err; // never a non-404 fault; OFF by default\n if (collectionUpdate) {\n // Issue #34: the spec defines NO item-path update for this resource\n // (the item path is GET-only; a PUT to it 405s), and a raw update\n // sends exactly what it was told — the gate declines, and the typed\n // error is self-explaining (the route tried, the status, the opt-in).\n throw this.putFallbackDeclined(err, route, false);\n }\n // Issue #34: the item path is the universal fallback route — retry\n // ONCE as PUT /{Entity}/{id} with the caller's fields merged onto a\n // fresh unredacted read of the current record, so the retry is never\n // a null-clearing partial. A 404 that also 404s the retry declines\n // with the self-explaining typed error (exactly one retry — no loop).\n const merged = await this.putFallbackMergedBody(\n () => this.getGlobalUnredacted(numeric),\n body,\n numeric,\n );\n let retry: unknown;\n try {\n retry = await this.http.request<unknown>({\n method: 'PUT',\n path: `${this.resourcePath}/${numeric}`,\n body: merged,\n operation,\n });\n } catch (rerr) {\n if (this.putFallbackEligible(rerr)) throw this.putFallbackDeclined(rerr, route, true);\n throw rerr;\n }\n return unwrapOperation(retry, operation);\n }\n return unwrapOperation(res, operation);\n }\n\n /** `DELETE /V1.0/<E>/{id}` → `{ id }` (OperationResultModel). A blank 2xx\n * (204 / empty body) is a valid vendor delete answer — synthesize the\n * result from the path id (issue #25: the transport returns undefined\n * for it; a non-blank wrong shape still throws via unwrapOperation). */\n protected async deleteGlobal(id: Identifier): Promise<OperationResult> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.http.request<unknown>({\n method: 'DELETE',\n path: `${this.resourcePath}/${numeric}`,\n operation: `${this.config.key}.delete`,\n });\n return res === undefined ? { id: numeric } : unwrapOperation(res, `${this.config.key}.delete`);\n }\n\n protected scopedCollectionPath(parentId: Identifier): string {\n if (this.config.parentScopedPath === undefined) {\n throw new AutotaskConfigError(`Resource ${this.config.key} is not parent-scoped; there is no parent-scoped path`);\n }\n const p = parseIdentifier(parentId, 'parentId');\n return this.config.parentScopedPath.replace('{parentId}', String(p));\n }\n\n protected scopedItemPath(parentId: Identifier, id: Identifier): string {\n return `${this.scopedCollectionPath(parentId)}/${parseIdentifier(id, 'id')}`;\n }\n\n /** Parent-scoped create: `POST .../{parentId}/<Child>` (issue #13: a drifted 2xx runs the bounded marker recovery where the plan pins a marker field). */\n protected async createScopedRaw(parentId: Identifier, data: TCreate, opts: CreateOpts = {}): Promise<OperationResult> {\n const body = this.normalizeMutationBody(data as Record<string, unknown>);\n const res = await this.http.request<unknown>({\n method: 'POST',\n path: this.scopedCollectionPath(parentId),\n body,\n operation: `${this.config.key}.create`,\n });\n return this.unwrapCreateOperation(res, body, opts);\n }\n\n /** Parent-scoped update: `PATCH .../{parentId}/<Child>` — the COLLECTION.\n * Swagger documents put+patch on the scoped collection and has NO put/patch on\n * the item path anywhere in the spec; the node strips the id from the path and\n * PATCHes the collection, and the vendor keys the record by the id in the body. */\n protected async updateScopedRaw(parentId: Identifier, id: Identifier, data: TUpdate): Promise<OperationResult> {\n const numeric = parseIdentifier(id, 'id');\n const body = this.normalizeMutationBody(data as Record<string, unknown>);\n body.id = numeric; // the record is keyed by the id in the body\n const path = this.scopedCollectionPath(parentId);\n const operation = `${this.config.key}.update`;\n let res: unknown;\n try {\n res = await this.http.request<unknown>({\n method: 'PATCH',\n path,\n body,\n operation,\n });\n } catch (err) {\n if (!this.putFallbackEligible(err)) throw err; // never a non-404 fault; OFF by default\n // Issue #34: the zone dropped the scoped collection route — retry\n // ONCE as PUT on the scoped item path (the spec's readable route for\n // these children) with the caller's fields merged onto a fresh\n // unredacted read of the current record, so the fallback is never a\n // null-clearing partial. A 404 that also 404s the retry declines with\n // the self-explaining typed error (exactly one retry — no loop).\n const merged = await this.putFallbackMergedBody(\n () => this.getScopedUnredacted(parentId, numeric),\n body,\n numeric,\n );\n let retry: unknown;\n try {\n retry = await this.http.request<unknown>({\n method: 'PUT',\n path: `${path}/${numeric}`,\n body: merged,\n operation,\n });\n } catch (rerr) {\n if (this.putFallbackEligible(rerr)) throw this.putFallbackDeclined(rerr, `PUT ${path}/${numeric}`, true);\n throw rerr;\n }\n return unwrapOperation(retry, operation);\n }\n return unwrapOperation(res, operation);\n }\n\n /** Parent-scoped delete: `DELETE .../{parentId}/<Child>/{id}` → `{ id }`\n * (a blank 2xx synthesizes `{ id }` from the path id — issue #25). */\n protected async deleteScopedRaw(parentId: Identifier, id: Identifier): Promise<OperationResult> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.http.request<unknown>({\n method: 'DELETE',\n path: this.scopedItemPath(parentId, id),\n operation: `${this.config.key}.delete`,\n });\n return res === undefined ? { id: numeric } : unwrapOperation(res, `${this.config.key}.delete`);\n }\n\n /**\n * Attachment delete: the vendor returns the deleted attachment MODEL, not\n * OperationResultModel (G1 envelope.md) — pass it through typed.\n */\n protected async deleteScopedModel(parentId: Identifier, id: Identifier): Promise<T> {\n const numeric = parseIdentifier(id, 'id');\n const res = await this.http.request<unknown>({\n method: 'DELETE',\n path: this.scopedItemPath(parentId, id),\n operation: `${this.config.key}.delete`,\n });\n // Issue #25: a blank 2xx (204 / empty body) delete answer carries no\n // model — return the EMPTY model (never throw); a non-blank wrong\n // shape still refuses.\n if (res === undefined) return {} as T;\n if (!isRecord(res)) {\n throw new AutotaskError(\n `Expected the deleted attachment model for ID ${numeric}; got a different shape`,\n { code: 'INVALID_RESPONSE', category: 'server', resourceIds: [numeric] },\n );\n }\n return res as T;\n }\n\n // ------------------------------------------------------------------\n // Entity metadata trio (global paths; the vendor defines them for children too)\n // ------------------------------------------------------------------\n\n /** `GET /V1.0/<E>/entityInformation` → `{ info }` unwrapped.\n * Goes through the field cache when it is present (issue #80:\n * default-on; `fieldCache: false` = the bit-for-bit uncached wire\n * path). A fresh\n * (bypass + refresh) metadata read is the caller's act: drop the\n * entity's entries via the fieldCache's `invalidate` first — the trio\n * keeps its no-arg surface (the registry/MCP arity pin). */\n async getEntityInfo(): Promise<EntityInformationModel> {\n return (await this.cachedMeta(\n 'info',\n `${this.resourcePath}/entityInformation`,\n `${this.config.key}.getEntityInfo`,\n (res): EntityInformationModel => {\n const body = isRecord(res) ? res : undefined;\n if (body === undefined || !isRecord(body.info)) {\n throw new AutotaskError('Expected the entityInformation envelope { info }; got a different shape', {\n code: 'INVALID_RESPONSE',\n category: 'server',\n });\n }\n return body.info as unknown as EntityInformationModel;\n },\n )) as EntityInformationModel;\n }\n\n /** `GET /V1.0/<E>/entityInformation/fields` → `{ fields }` unwrapped.\n * Goes through the field cache when it is present (issue #80:\n * default-on; `fieldCache: false` = the bit-for-bit uncached wire\n * path). A fresh\n * (bypass + refresh) metadata read is the caller's act: drop the\n * entity's entries via the fieldCache's `invalidate` first — the trio\n * keeps its no-arg surface (the registry/MCP arity pin). */\n async getFieldInfo(): Promise<FieldInformationModel[]> {\n return (await this.cachedMeta(\n 'fields',\n `${this.resourcePath}/entityInformation/fields`,\n `${this.config.key}.getFieldInfo`,\n (res) => this.unwrapFields(res, 'FieldInformationResultModel'),\n )) as FieldInformationModel[];\n }\n\n /** `GET /V1.0/<E>/entityInformation/userDefinedFields` → `{ fields }` unwrapped.\n * Goes through the field cache when it is present (issue #80:\n * default-on; `fieldCache: false` = the bit-for-bit uncached wire\n * path). A fresh\n * (bypass + refresh) metadata read is the caller's act: drop the\n * entity's entries via the fieldCache's `invalidate` first — the trio\n * keeps its no-arg surface (the registry/MCP arity pin). */\n async getUdfInfo(): Promise<Field[]> {\n return (await this.cachedMeta(\n 'udf',\n `${this.resourcePath}/entityInformation/userDefinedFields`,\n `${this.config.key}.getUdfInfo`,\n (res) => this.unwrapFields(res, 'UserDefinedFieldInformationResultModel') as unknown as Field[],\n )) as Field[];\n }\n\n private unwrapFields(body: unknown, envelopeName: string): FieldInformationModel[] {\n if (!isRecord(body) || !Array.isArray(body.fields)) {\n throw new AutotaskError(`Expected the ${envelopeName} envelope { fields: [] }; got a different shape`, {\n code: 'INVALID_RESPONSE',\n category: 'server',\n });\n }\n return body.fields as FieldInformationModel[];\n }\n\n // ------------------------------------------------------------------\n // Compositions used by special ops (node-parity flows)\n // ------------------------------------------------------------------\n\n /**\n * Bounded read against another entity's global `query` endpoint (special-op\n * compositions only; the primary surface stays the resource's own ops).\n */\n protected async queryEntity<TItem>(\n entityPath: string,\n conditions: FilterCondition[],\n opts: { maxRecords?: number; includeFields?: string[] } = {},\n ): Promise<TItem[]> {\n const body: Record<string, unknown> = { filter: buildFilter(conditions).filter };\n if (opts.maxRecords !== undefined) body.MaxRecords = clampPageSize(opts.maxRecords);\n if (opts.includeFields !== undefined) body.IncludeFields = opts.includeFields;\n const res = await this.http.request<unknown>({\n method: 'POST',\n idempotent: true,\n path: entityPath,\n body,\n operation: `${this.config.key}.cross-query`,\n });\n return unwrapItems<TItem>(res, `${this.config.key}.cross-query`).items;\n }\n\n /**\n * `createIfNotExists` — the node's dedup composition: query by the caller's\n * dedup fields (eq conditions, and-wrapped); a match short-circuits the\n * create and returns the existing record; otherwise create. With no\n * `dedupFields` this is a plain create (`created: true`).\n *\n * Top-level resources: `createIfNotExists(data, opts)` — the create POSTs\n * the global collection. Parent-scoped resources:\n * `createIfNotExists(parentId, data, opts)` — parentId is REQUIRED. Their\n * global collection has no POST in the swagger; the only documented create\n * is the scoped collection (`POST .../{parentId}/<Child>`), so a missing\n * parentId throws a config error instead of issuing a wrong-path request.\n * The dedup lookup stays a GLOBAL query (the entity carries the parent id\n * field): the filter is the dedup fields + `parentField eq parentId`, which\n * narrows the match set to the parent.\n *\n * (The node additionally verifies the parent exists for configuration items;\n * the SDK omits that preflight — a missing parent surfaces as the vendor's\n * 4xx on the create.)\n */\n createIfNotExists(\n data: TCreate,\n opts?: { dedupFields?: string[]; dryRun?: boolean },\n ): Promise<CreateIfNotExistsResult<T> | DryRunResult<TCreate>>;\n createIfNotExists(\n parentId: Identifier,\n data: TCreate,\n opts?: { dedupFields?: string[]; dryRun?: boolean },\n ): Promise<CreateIfNotExistsResult<T> | DryRunResult<TCreate>>;\n async createIfNotExists(\n dataOrParentId: TCreate | Identifier,\n dataOrOpts?: TCreate | { dedupFields?: string[]; dryRun?: boolean },\n opts: { dedupFields?: string[]; dryRun?: boolean } = {},\n ): Promise<CreateIfNotExistsResult<T> | DryRunResult<TCreate>> {\n const isObject = (v: unknown): v is Record<string, unknown> =>\n isRecord(v) && !Array.isArray(v);\n const scoped = this.config.parentScopedPath !== undefined;\n let parentId: Identifier | undefined;\n let data: TCreate;\n let cinOpts: { dedupFields?: string[]; dryRun?: boolean };\n if (scoped) {\n const dataIsOptsBag = isObject(dataOrOpts) && ('dedupFields' in dataOrOpts || 'dryRun' in dataOrOpts);\n if (!isIdentifierCandidate(dataOrParentId) || !isObject(dataOrOpts) || dataIsOptsBag) {\n throw new AutotaskConfigError(\n `createIfNotExists for parent-scoped resource ${this.config.key} requires (parentId, data[, opts]) — the global collection has no create; a missing parentId would be a wrong-path request`,\n );\n }\n parentId = parseIdentifier(dataOrParentId, 'parentId');\n data = dataOrOpts as TCreate;\n cinOpts = opts;\n } else {\n if (!isObject(dataOrParentId)) {\n throw new AutotaskConfigError(\n `createIfNotExists for top-level resource ${this.config.key} takes (data[, opts]) — got a non-record first argument`,\n );\n }\n data = dataOrParentId;\n cinOpts = isObject(dataOrOpts) ? dataOrOpts : {};\n }\n const record: Record<string, unknown> = isRecord(data) ? data : {};\n const dedupFields = (cinOpts.dedupFields ?? []).filter((field) => field in record);\n let existing: T | undefined;\n let existingId: Identifier | undefined;\n if (dedupFields.length > 0) {\n const conditions: FilterCondition[] = dedupFields.map((field) => ({\n field,\n op: 'eq',\n value: record[field] as FilterValue | FilterValue[],\n }));\n // The dedup lookup stays a GLOBAL query; scoping it to the parent\n // narrows (never widens) the match set for a scoped create.\n if (parentId !== undefined && this.config.parentField !== undefined) {\n conditions.unshift({ field: this.config.parentField, op: 'eq', value: parentId });\n }\n const matches = await this.queryEntity<T>(`${this.resourcePath}/query`, conditions, { maxRecords: 10 });\n const first = matches[0];\n if (first !== undefined) {\n const firstId = (first as Record<string, unknown>).id;\n if (typeof firstId === 'number') {\n existing = first;\n existingId = firstId;\n }\n }\n }\n if (cinOpts.dryRun === true) {\n // The dedup lookup is a read (allowed in dry-run); the create is never\n // issued. A duplicate match short-circuits: wouldApply is false.\n const checks: DryRunCheck[] = [\n { name: 'input-validation', ok: isRecord(data) && Object.keys(data).length > 0 },\n ];\n if (dedupFields.length > 0) {\n checks.push({ name: 'duplicate-detection', ok: existingId === undefined });\n }\n const warnings =\n existingId !== undefined\n ? [`duplicate match on ${dedupFields.join(', ')} (id ${existingId}); the create would be skipped`]\n : [];\n return buildDryRunResult({\n operation: `${this.config.key}.createIfNotExists`,\n method: 'POST',\n path:\n parentId !== undefined\n ? this.scopedCollectionPath(parentId)\n : this.resourcePath,\n ids: existingId !== undefined ? [existingId] : [],\n checks,\n warnings,\n impact: { affected: 1, scope: 'single-record', reversible: true },\n data,\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n if (existing !== undefined && existingId !== undefined) {\n return { id: existingId, created: false, existing };\n }\n const op =\n parentId !== undefined\n ? await this.createScopedRaw(parentId, data)\n : await this.createGlobal(data);\n return { id: op.id, created: true };\n }\n\n // ------------------------------------------------------------------\n // Dry-run scaffolding + stale-object guard (mutation safety, section 19.3)\n // ------------------------------------------------------------------\n\n /**\n * Stale-object guard (section 19.3): compare the plan's `staleCheck` field\n * (vendor `lastModifiedDate`) against the caller-observed value. Mismatch\n * throws `STALE_OBJECT`. Returns true when a comparison was actually made\n * (the resource model carries the field AND the vendor answered it AND the\n * caller supplied an expected value); false when the check is unavailable.\n */\n protected staleObjectCheck(\n current: Record<string, unknown>,\n opts: MutationOpts,\n operation: string,\n ): boolean {\n const field = this.config.staleField;\n const expected = opts.lastModifiedDate;\n if (field === undefined || expected === undefined) return false;\n const actual = current[field];\n if (typeof actual !== 'string') return false; // vendor omitted the field on this record\n if (actual !== expected) {\n throw new StaleObjectError(\n `stale object: ${this.config.key} ${field} changed since the caller read it (expected ${expected}, current ${actual})`,\n {\n code: 'STALE_OBJECT',\n operation,\n suggestedAction: 'Re-read the record and retry with the fresh lastModifiedDate.',\n },\n );\n }\n return true;\n }\n\n /**\n * Stale-object guard for a REAL mutation: the caller supplied an expected\n * `lastModifiedDate` and the model carries the field → fetch the current\n * record and compare before the mutating request (mismatch throws\n * STALE_OBJECT; a vanished record propagates the vendor's NotFoundError).\n */\n protected async guardStaleBeforeMutation(\n id: Identifier,\n opts: MutationOpts,\n operation: string,\n parentId?: Identifier,\n ): Promise<void> {\n if (opts.lastModifiedDate === undefined || this.config.staleField === undefined) return;\n // Issue #14: the guard's own verification read is the UPDATE's step — a\n // target miss carries the pinned update-row reason (additive).\n let current: unknown;\n try {\n current =\n parentId === undefined\n ? await this.getGlobal(id, true)\n : this.config.attachmentGet\n ? await this.getScopedModel(parentId, id, true)\n : await this.getScopedRaw(parentId, id, true);\n } catch (err) {\n if (err instanceof NotFoundError) attachUpdateTargetMissReason(err, this.config.key);\n throw err;\n }\n this.staleObjectCheck(current as unknown as Record<string, unknown>, opts, operation);\n }\n\n /**\n * `create` dry-run: input validation + parent verification (scoped\n * resources) + the pinned envelope. NO request is issued (scoped parent\n * verification is a read). Duplicate detection has no reliable lookup for\n * a plain create (that is `createIfNotExists`), so it is not claimed.\n */\n protected async runCreateDryRun<TData extends object>(\n data: TData,\n parentId?: Identifier,\n ): Promise<DryRunResult<TData>> {\n const checks: DryRunCheck[] = [];\n const warnings: string[] = [];\n checks.push({ name: 'input-validation', ok: isRecord(data) && Object.keys(data).length > 0 });\n // Issue #9: the spec-derived delete boundary (plan.deleteBoundaries — the\n // vendored spec defines NO DELETE on the entity's paths). REPORT-ONLY:\n // the check is ok: true (the write itself is valid — wouldApply is\n // preserved; the design's ok:false example would break the pinned\n // companies/tickets create-dry-run contract) and the WARNING carries\n // the boundary note + the UI-only cleanup pointer. Zero wire: the note\n // is generated plan data (the SAME note the record's\n // metadata.deleteBoundary stamp serves via the describe channel — the\n // two channels cannot drift).\n const deleteBoundaryNote = DELETE_BOUNDARY_NOTES[this.config.key];\n if (deleteBoundaryNote !== undefined) {\n checks.push({ name: 'delete-boundary', ok: true });\n warnings.push(deleteBoundaryNote);\n }\n let path = this.resourcePath;\n if (parentId !== undefined) {\n path = this.scopedCollectionPath(parentId);\n const parentPath = this.config.parentPath;\n if (parentPath === undefined) {\n throw new AutotaskConfigError(\n `dry-run: ${this.config.key} is parent-scoped but has no parentPath configured`,\n );\n }\n // Issue #80 (the cache flip): the parent check must stay FRESH — a\n // default-on ReadCache would otherwise answer it with a stale\n // positive entry or a stale #36 absent marker (both directions\n // corrupt the verdict). `fetchRecordRaw(..., fresh)` skips the cache\n // lookup AND the marker (the read still refreshes the positive\n // entry); the guard + try/catch reproduce contextFetch's null\n // contract (invalid reference id -> null, vendor not-found -> null)\n // WITHOUT storing an absent marker. contextFetch itself is UNCHANGED\n // for the getContext composites (the #36 zero-wire marker contract\n // stands there).\n let parent: Record<string, unknown> | null = null;\n if (typeof parentId === 'number' && Number.isInteger(parentId) && parentId >= 0) {\n try {\n parent = await this.fetchRecordRaw<Record<string, unknown>>(parentPath, parentId, true);\n } catch (err) {\n if (!(err instanceof NotFoundError)) throw err;\n }\n }\n checks.push({ name: 'parent-exists', ok: parent !== null });\n if (parent === null) {\n warnings.push(`parent ${parentId} not found; the vendor would reject the create`);\n }\n }\n return buildDryRunResult({\n operation: `${this.config.key}.create`,\n method: 'POST',\n path,\n ids: [],\n checks,\n impact: { affected: 1, scope: 'single-record', reversible: true },\n warnings,\n data,\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n\n /**\n * `update` dry-run: input validation + current-record fetch (a missing\n * record carries `warnings` and no `diff` — pinned), the stale-object\n * check (mismatch throws STALE_OBJECT) and the best-effort `diff`. NO\n * mutating request is issued.\n */\n protected async runUpdateDryRun<TData extends object>(\n id: Identifier,\n data: TData,\n opts: MutationOpts = {},\n parentId?: Identifier,\n ): Promise<DryRunResult<TData>> {\n const operation = `${this.config.key}.update`;\n const checks: DryRunCheck[] = [];\n const warnings: string[] = [];\n checks.push({ name: 'input-validation', ok: isRecord(data) && Object.keys(data).length > 0 });\n // The envelope must report the route the CONFIRMED write issues (D1):\n // scoped updates PATCH the scoped collection; collection-only-writable\n // top-level updates PUT the global collection (id in the body) — the\n // item path is GET-only in the vendored spec for those. The\n // current-record fetch below stays item-based (GET /V1.0/<E>/{id}).\n const scopedUpdate = parentId !== undefined && this.config.parentScopedPath !== undefined;\n const collectionUpdate = scopedUpdate || this.config.collectionUpdate === true;\n const path = scopedUpdate\n ? this.scopedCollectionPath(parentId)\n : collectionUpdate\n ? this.resourcePath\n : `${this.resourcePath}/${id}`;\n const method: 'PUT' | 'PATCH' = scopedUpdate ? 'PATCH' : 'PUT';\n let current: Record<string, unknown> | null = null;\n try {\n current = (\n parentId === undefined\n ? await this.getGlobal(id, true)\n : this.config.attachmentGet\n ? await this.getScopedModel(parentId, id, true)\n : await this.getScopedRaw(parentId, id, true)\n ) as unknown as Record<string, unknown>;\n } catch (err) {\n if (err instanceof NotFoundError) {\n // Issue #14: the pinned UPDATE-row reason (tenant-empty-for-user /\n // unreadable-scoped-child) rides the envelope (additive: wouldApply\n // stays false — the check fails either way) + the check note, so a\n // target miss reads as the typed reason, not a bare \"not fetchable\".\n const updateReason = EMPTY_REASON_STAMPS[this.config.key]?.update;\n checks.push({\n name: 'current-record-exists',\n ok: false,\n ...(updateReason !== undefined ? { note: updateReason.note } : {}),\n });\n warnings.push(`current record ${id} not fetchable; no diff`);\n return buildDryRunResult({\n operation,\n method,\n path,\n ids: [id],\n checks,\n impact: { affected: 1, scope: 'single-record', reversible: true },\n warnings,\n data,\n ...(updateReason !== undefined ? { emptyReason: updateReason } : {}),\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n throw err;\n }\n checks.push({ name: 'current-record-exists', ok: true });\n if (this.staleObjectCheck(current, opts, operation)) {\n checks.push({ name: 'stale-check', ok: true });\n }\n // V2 partial-update merge: for a top-level collectionUpdate non-raw\n // update the envelope `data` is the MERGED body — exactly what the\n // confirmed collection PUT would send. The current record fetched above\n // doubles as the merge source: the ONE shared read serves the diff, the\n // stale-object check and the merge (no second request). Raw dry runs\n // report the caller's body as-is (pre-merge behaviour).\n let envelopeData: TData = data;\n if (parentId === undefined && this.config.collectionUpdate === true && opts.raw !== true) {\n envelopeData = mergePartialBody(\n current,\n this.normalizeMutationBody(data as Record<string, unknown>),\n ) as unknown as TData;\n }\n return buildDryRunResult({\n operation,\n method,\n path,\n ids: [id],\n checks,\n diff: computeFieldDiff(current, data),\n impact: { affected: 1, scope: 'single-record', reversible: true },\n warnings,\n data: envelopeData,\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n\n /**\n * `delete` dry-run: current-record verification + the stale-object check +\n * the pinned envelope (no diff — a delete has no before/after fields). NO\n * mutating request is issued.\n */\n protected async runDeleteDryRun(\n id: Identifier,\n opts: MutationOpts = {},\n parentId?: Identifier,\n ): Promise<DryRunResult<Record<string, unknown>>> {\n const operation = `${this.config.key}.delete`;\n const checks: DryRunCheck[] = [];\n const warnings: string[] = [];\n const path =\n parentId === undefined ? `${this.resourcePath}/${id}` : this.scopedItemPath(parentId, id);\n let current: Record<string, unknown> | null = null;\n try {\n current = (\n parentId === undefined\n ? await this.getGlobal(id, true)\n : this.config.attachmentGet\n ? await this.getScopedModel(parentId, id, true)\n : await this.getScopedRaw(parentId, id, true)\n ) as unknown as Record<string, unknown>;\n } catch (err) {\n if (err instanceof NotFoundError) {\n checks.push({ name: 'current-record-exists', ok: false });\n warnings.push(`record ${id} not fetchable; the vendor would reject the delete`);\n return buildDryRunResult({\n operation,\n method: 'DELETE',\n path,\n ids: [id],\n checks,\n impact: { affected: 1, scope: 'single-record', reversible: false },\n warnings,\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n throw err;\n }\n checks.push({ name: 'current-record-exists', ok: true });\n if (this.staleObjectCheck(current, opts, operation)) {\n checks.push({ name: 'stale-check', ok: true });\n }\n return buildDryRunResult({\n operation,\n method: 'DELETE',\n path,\n ids: [id],\n checks,\n impact: { affected: 1, scope: 'single-record', reversible: false },\n warnings,\n }, { redactPersonalData: this.http.redactPersonalData });\n }\n\n /**\n * Attachment `download`: `GET .../{parentId}/<Child>/{id}/data` → Buffer\n * (node-proven `/data` path, quirk #9; the metadata GET is `get`).\n */\n protected async downloadScoped(parentId: Identifier, id: Identifier): Promise<Buffer> {\n const res = await this.http.request<unknown>({\n method: 'GET',\n path: `${this.scopedItemPath(parentId, id)}/data`,\n operation: `${this.config.key}.download`,\n });\n return decodeFileData(res);\n }\n\n // ------------------------------------------------------------------\n // Cross-entity reads + resolution helpers (helper-floor ops, G4)\n // ------------------------------------------------------------------\n\n /** Raw single-record read on ANY entity path: `GET <path>/{id}` → `{ item }`\n * unwrapped (`item: null` → NotFoundError). Used by `resolve` (id branch)\n * and `getContext` (the cross-entity parts); the operation tag is scoped to\n * the resource + call site so errors stay attributable. `fresh` skips the\n * cache lookup (the read still refreshes the entry for the other callers):\n * the composite ROOT of a hot resource (issue #36) must see the live\n * record, never a snapshot. */\n protected async fetchRecordRaw<TRec>(entityPath: string, id: Identifier, fresh = false): Promise<TRec> {\n const numeric = parseIdentifier(id, 'id');\n // issue #32: the entry takes the READ ENTITY's TTL — the plan key of\n // the entity this path points to (a cross-entity context part expires\n // on its own resource's override, never the caller's). A path the\n // plan does not name is undefined -> the base ttlMs.\n const resource = RESOURCE_KEY_BY_PATH[entityPath];\n const res = await this.cachedGet(`${entityPath}/${numeric}`, `${this.config.key}.fetchRecord`, fresh, resource);\n // FULL100 F5: model-direct resources (the *_attachments family — the spec\n // 200 schema is the raw model) answer the item path without the { item }\n // envelope; parse with the tolerant model-or-envelope rule, or every\n // numeric resolve on the family crashed INVALID_RESPONSE.\n if (this.config.attachmentGet) {\n return this.unwrapModelLike<TRec>(res, numeric);\n }\n return unwrapItem<TRec>(res, numeric, `${this.config.key}.fetchRecord`);\n }\n\n /**\n * `getContext` part fetch: a single-record read that degrades to `null`\n * when the reference id is absent (or the vendor answers not-found).\n * Other errors propagate — a part that fails on a real fault is not a\n * \"missing reference\".\n *\n * Issue #36 (negative caching, the pinned hazard): the vendor's true\n * not-found (the HTTP 404 or the 200 `item: null` signal — both surface\n * as `NotFoundError`) is stored as an ABSENT marker in the SAME ReadCache\n * under a namespaced key the positive get path never constructs, so a\n * repeat composite call serves 'absent' with zero wire for that part.\n * The marker expires on the READ entity's TTL (the #32 per-resource\n * table / `perResourceTtlMs` override, via `set`'s resource key) and is\n * cleared by any real write through the client (the ReadCache clear).\n * A transient fault (5xx, shape drift, network) is NEVER stored as an\n * ABSENT marker — it propagates and the next call re-wires (no\n * poisoning; a malformed 200 body may still land under the POSITIVE\n * key — pre-existing ReadCache behaviour, out of this mechanism's\n * scope). The marker is consulted BEFORE the positive lookup, but a\n * POSITIVE entry that exists alongside a live marker means a newer\n * positive outcome (this client read/created the record after the\n * not-found) — the marker is dropped and the positive entry serves\n * (the newest outcome wins in both directions). A record created\n * ELSEWHERE may serve 'absent' until the marker TTL expires (or a write\n * through this client lands) — the opt-in staleness contract, same\n * trade as the positive entries.\n */\n protected async contextFetch<TRec>(entityPath: string, referenceId: unknown): Promise<TRec | null> {\n if (typeof referenceId !== 'number' || !Number.isInteger(referenceId) || referenceId < 0) {\n return null;\n }\n const cache = this.http.readCache;\n const absentKey = contextAbsentKey(`${entityPath}/${referenceId}`);\n if (cache !== undefined && cache.get(absentKey) !== undefined) {\n if (cache.get(`${entityPath}/${referenceId}`) !== undefined) {\n // A POSITIVE outcome landed after the marker (this client read or\n // created the record): the newest outcome wins — drop the stale\n // marker and fall through to the positive entry. A `{item: null}`\n // positive entry re-raises the marker on the unwrap below, so this\n // never serves a not-found record as present (issue #36 QA).\n cache.delete(absentKey);\n } else {\n return null; // the FK 'absent' marker is live (issue #36): zero wire\n }\n }\n const epoch = cache?.epoch;\n try {\n return await this.fetchRecordRaw<TRec>(entityPath, referenceId);\n } catch (err) {\n if (err instanceof NotFoundError) {\n // A vendor not-found (never a fault): store the marker under the\n // READ entity's resource key so the #32 TTL governs its expiry.\n cache?.set(absentKey, CONTEXT_ABSENT_MARKER, RESOURCE_KEY_BY_PATH[entityPath], epoch);\n return null;\n }\n throw err;\n }\n }\n\n /**\n * `resolve` — the helper-floor resolution (section 19.2), with cost and\n * truncation tracking (`resolveDetailed`); the plain `resolveBase` is its\n * value projection. Pinned semantics:\n * - numeric id (number or all-digit string) → single record read; a miss\n * throws NotFoundError (the vendor's own not-found, cost `direct`);\n * - bare value → SERVER FILTER FIRST: exact (`eq`) on the `searchFields`\n * (OR-grouped when the entity covers several), bounded to 2 records —\n * 1 → the record (cost `server-filter`), ≥2 → RESOLUTION_AMBIGUOUS with\n * the candidate ids;\n * - zero items is a COMPLETE non-match (the server filter is\n * authoritative) → null, cost `server-filter`. `pageDetails.requestCount`\n * is NOT consulted: the vendor echoes the requested MaxRecords there\n * (live-verified: 10 on a zero-match page), so it carries no match count;\n * - only with `resolution.scanOnMiss: true` is a miss re-checked by the\n * bounded CLIENT SCAN: an unfiltered walk, exact match on the\n * `searchFields`, capped by the client caps (`maxScanRecords` /\n * `maxScanPages`). A hit is cost `client-scan`; a completed scan with no\n * match → null; a cap-tripped scan THROWS RESOLUTION_TRUNCATED — never a\n * silent null.\n * - bare value on an id-only resource → AutotaskConfigError (CONFIG_ERROR).\n */\n async resolveDetailed(identifier: number | string): Promise<Resolution<T>> {\n let numeric: Identifier | null = null;\n if (isIdentifierCandidate(identifier)) {\n // A numeric id: a safe integer number, or an all-digit string.\n // parseIdentifier refuses a corrupted (unsafe) JS number and KEEPS an\n // all-digit string beyond the safe range as its exact digits — the\n // string passthrough is the only lossless carrier for vendor ids above\n // 2^53 (a Number here would silently lose precision in the URL path).\n numeric = parseIdentifier(identifier, 'id');\n }\n if (numeric !== null) {\n // A miss here is the vendor's own NOT_FOUND (fetchRecordRaw throws it).\n const record = await this.fetchRecordRaw<T>(this.resourcePath, numeric);\n return { value: record, resolutionCost: 'direct', scanned: 0, scanTruncated: false };\n }\n if (typeof identifier !== 'string' || identifier.trim() === '') {\n throw new AutotaskConfigError('resolve: identifier must be a numeric id or a non-empty value');\n }\n const value = identifier.trim();\n const fields = this.config.searchFields ?? [];\n if (fields.length === 0) {\n throw new AutotaskConfigError(\n `resolve: ${this.config.key} has no primary text field (ids only)`,\n );\n }\n const leaf: FilterCondition[] = fields.map((field) => ({ field, op: 'eq', value }));\n const root: FilterCondition = leaf.length === 1 ? leaf[0]! : { op: 'or', items: leaf };\n const items = await this.queryPage1<T>([root], 2);\n if (items.length === 1) {\n return { value: items[0]!, resolutionCost: 'server-filter', scanned: 0, scanTruncated: false };\n }\n if (items.length >= 2) {\n const ids = items\n .map((m) => (m as Record<string, unknown>).id)\n .filter((id): id is number => typeof id === 'number');\n throw new ResolutionError(\n `resolve: \"${value}\" is ambiguous on ${this.config.key} (matched ${items.length} records)`,\n {\n code: 'RESOLUTION_AMBIGUOUS',\n resourceIds: ids,\n // issue #59 PR-B: the miss-channel pointer (the generic floor names\n // the resource's own search op — reachable only where searchFields\n // is non-empty, so the named op always exists here).\n suggestedAction:\n `Narrow the identifier to the full exact value, or run ${this.config.key}.search (contains match) for candidate records to disambiguate.`,\n },\n );\n }\n if (!this.resolutionCaps.scanOnMiss) {\n // Complete non-match: the server filter is authoritative.\n return { value: null, resolutionCost: 'server-filter', scanned: 0, scanTruncated: false, triedFields: fields };\n }\n const scan = await this.scanForExactMatch(value, fields);\n if (scan.found !== null) {\n return {\n value: scan.found,\n resolutionCost: 'client-scan',\n scanned: scan.scanned,\n scanTruncated: false,\n };\n }\n if (scan.truncated) {\n throw new ResolutionError(\n `resolve: \"${value}\" is unverified on ${this.config.key} — the bounded client scan read ${scan.scanned} records (cap) without completing; a complete non-match cannot be proven`,\n {\n code: 'RESOLUTION_TRUNCATED',\n // issue #59 PR-B: the pointer channel on the unverified-miss outcome\n // (the contains-candidates channel is the resource's search op).\n suggestedAction:\n `Retry with a more specific identifier, or narrow the search to fewer records (contains candidates: ${this.config.key}.search).`,\n },\n );\n }\n return { value: null, resolutionCost: 'client-scan', scanned: scan.scanned, scanTruncated: false, triedFields: fields };\n }\n\n /**\n * Issue #78: `resolve` with the miss explained. A hit is `{ record, resolutionCost }`\n * (unchanged). A miss is never a bare `null`: `miss` carries the fields and operator\n * tried, the blind-surface stamp when the surface is blind, and the next steps.\n * Thrown outcomes (not found by id, ambiguous, truncated) are unchanged.\n */\n async resolveWithDetail(identifier: number | string): Promise<ResolveWithDetail<T>> {\n const r = await this.resolveDetailed(identifier);\n if (r.value !== null) return { record: r.value, resolutionCost: r.resolutionCost };\n return { record: null, resolutionCost: r.resolutionCost, miss: this.missDetail('eq', r.triedFields ?? this.config.searchFields ?? []) };\n }\n\n /**\n * Issue #78: `search` with an empty result explained (a bare `[]` reads as complete on a\n * blind surface). Hits are `{ items }` (unchanged); an empty result adds `miss`.\n */\n async searchWithDetail(query: string, opts: { limit?: number } = {}): Promise<SearchWithDetail<T>> {\n const items = await this.searchBase(query, opts);\n if (items.length > 0) return { items };\n return { items, miss: this.missDetail('contains', this.config.searchFields ?? []) };\n }\n\n /** The shared miss explanation for `resolveWithDetail` / `searchWithDetail`. */\n private missDetail(operator: 'eq' | 'contains', fields: readonly string[]): MissDetail {\n const key = this.config.key;\n const probe: FilterCondition[] = fields.map((field) => ({ field, op: operator, value: '' }));\n const blind = blindStampFor(BLIND_SURFACE_STAMPS[key]?.query, probe);\n const next: string[] = [];\n if (blind !== undefined) {\n next.push(`This surface is blind to records the API user does not own, so a miss is not proof of absence: ${blind.authority} returns the record when the id is known.`);\n }\n next.push(\n operator === 'eq'\n ? `Matching is exact on ${fields.join(', ')} (other identifier forms were not tried); ${key}.search finds contains candidates.`\n : `Matching is a contains match on ${fields.join(', ')}; try a shorter or different fragment, or ${key}.resolve with the full exact value.`,\n );\n return { tried: { fields: [...fields], operator }, ...(blind !== undefined ? { blindSurface: blind } : {}), next };\n }\n\n /** The plain value projection of `resolveDetailed` (the `resolve` floor). */\n protected async resolveBase(identifier: number | string): Promise<T | null> {\n return (await this.resolveDetailed(identifier)).value;\n }\n\n /** The items of one page of the resource's own `/query`. */\n protected async queryPage1<TItem>(\n conditions: FilterCondition[],\n maxRecords: number,\n ): Promise<TItem[]> {\n const body: Record<string, unknown> = {\n filter: buildFilter(conditions).filter,\n MaxRecords: maxRecords,\n };\n const res = await this.http.request<unknown>({\n method: 'POST',\n idempotent: true,\n path: `${this.resourcePath}/query`,\n body,\n operation: `${this.config.key}.resolve`,\n });\n return unwrapItems<TItem>(res, `${this.config.key}.resolve`).items;\n }\n\n /**\n * The bounded client-scan fallback (section 19.2): an unfiltered walk of\n * the resource's own query endpoint, exact match on `fields`, bounded by\n * BOTH client caps (records AND pages). `truncated` is true when the caps\n * were hit before the walk completed (a complete non-match is unproven).\n */\n protected async scanForExactMatch(\n value: string,\n fields: string[],\n ): Promise<{ found: T | null; scanned: number; truncated: boolean }> {\n const caps = this.resolutionCaps;\n const pageSize = Math.max(1, Math.floor(caps.maxScanRecords / caps.maxScanPages));\n const state: QueryWalkState = { cursor: null };\n let scanned = 0;\n let pages = 0;\n let found: T | null = null;\n let exhausted = false;\n for (;;) {\n const page = await this.fetchPage({ maxRecords: pageSize }, pages + 1, pageSize, state);\n pages += 1;\n for (const item of page.items) {\n scanned += 1;\n const rec = item as unknown as Record<string, unknown>;\n if (fields.some((field) => rec[field] === value)) {\n found = item;\n break;\n }\n }\n if (found !== null) break;\n if (!page.hasMore) {\n exhausted = true;\n break;\n }\n if (pages >= caps.maxScanPages || scanned >= caps.maxScanRecords) break;\n }\n return { found, scanned, truncated: found === null && !exhausted };\n }\n\n /**\n * `findBy<field>` helpers: exact (`eq`) filter on one vendor field, bounded\n * to 2 records — 0 → null, 1 → the record, ≥2 → ResolutionError with the\n * candidate ids.\n */\n protected async findByField(field: string, value: string): Promise<T | null> {\n if (value.trim() === '') throw new AutotaskConfigError(`findBy${field}: empty value`);\n const matches = await this.queryEntity<T>(\n `${this.resourcePath}/query`,\n [{ field, op: 'eq', value: value.trim() }],\n { maxRecords: 2 },\n );\n if (matches.length === 0) return null;\n if (matches.length > 1) {\n const ids = matches\n .map((m) => (m as Record<string, unknown>).id)\n .filter((id): id is number => typeof id === 'number');\n throw new ResolutionError(\n `findBy${field}: \"${value}\" is ambiguous on ${this.config.key} (matched ${matches.length} records)`,\n { code: 'RESOLUTION_AMBIGUOUS', resourceIds: ids },\n );\n }\n return matches[0]!;\n }\n\n /**\n * `search` — the bounded contains surface (no vendor free-text search):\n * `contains` on every `searchFields` field (OR-grouped), `MaxRecords` =\n * `limit` (default 25, clamped to 1..500). Empty query → AutotaskConfigError.\n */\n protected async searchBase(query: string, opts: { limit?: number } = {}): Promise<T[]> {\n const text = query.trim();\n if (text === '') throw new AutotaskConfigError('search: empty query');\n const fields = this.config.searchFields ?? [];\n if (fields.length === 0) {\n throw new AutotaskConfigError(`search: ${this.config.key} has no searchable field`);\n }\n const limit = opts.limit === undefined ? 25 : clampPageSize(opts.limit);\n const leaf: FilterCondition[] = fields.map((field) => ({ field, op: 'contains', value: text }));\n const root: FilterCondition = leaf.length === 1 ? leaf[0]! : { op: 'or', items: leaf };\n return this.queryEntity<T>(`${this.resourcePath}/query`, [root], { maxRecords: limit });\n }\n}\n"],"mappings":"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ACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,MACZ,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AACF;AASO,IAAM,8BAA6C;AAAA,EACxD,cAAc;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA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AA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAAA,EACA,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EACA,wBAAwB;AAAA,IACtB;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,E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","names":["isPlainRecord","item","defaultStore","isRecord","isRecord","CREDENTIAL_HEADER_NAMES","isRecord","err","value","isRecord","body","items","pages","guard","sliced","cursor"]}
|