[{"slug":"ZV-2026-0250","server_name":"engine-production-3bdc.up.railway.app","severity":"breaking","title":"engine-production-3bdc.up.railway.app: New required field idempotency_key on create_checkout; requests without it will fail.","summary":"[risky] Description of create_checkout changed (57% word delta). [breaking] New required field idempotency_key on create_checkout; requests without it will fail.","changes":[{"kind":"description_changed","tool":"create_checkout","after":"Get a hosted-checkout link outside beta. Disabled while beta pricing is free.\n\n        The REQUIRED idempotency_key creates or replays one durable order and Stripe is\n        called under an order-derived key, so a retry never mints a second order or\n        session. Args: pack (from pricing.credit_packs), idempotency_key,\n        success_url/cancel_url, api_key (spend). Returns {checkout_url, pack, credits,\n        usd_cents, expires_at, order_id, order_state, replayed}. Errors: unauthorized,\n        forbidden, invalid_request, idempotency_conflict, payments_disabled, rate_limited.","before":"Get a hosted-checkout link outside beta. Disabled while beta pricing is free.\n\n        When payments are enabled, hand checkout_url to your human and the webhook credits\n        the account after payment.\n        Args: pack (a credits amount from pricing.credit_packs), success_url/cancel_url\n        (optional), api_key (spend scope). Returns {checkout_url, pack, credits, usd_cents,\n        expires_at}. Errors: unauthorized, forbidden, invalid_request (bad pack),\n        payments_disabled (503; no checkout or top-up is needed during beta), rate_limited.\n        ","detail":"Description of `create_checkout` changed (57% word delta).","severity":"risky","descriptionDelta":0.5696202531645569},{"kind":"input_required_added","path":"inputSchema.properties.idempotency_key","tool":"create_checkout","after":{"type":"string","title":"Idempotency Key","description":"REQUIRED caller-chosen replay key for this checkout. The same key replays the same durable order and Stripe session (never a second charge intent); the same key with different arguments is an idempotency_conflict. Matches REST's required Idempotency-Key header."},"detail":"New required field `idempotency_key` on `create_checkout`; requests without it will fail.","severity":"breaking"}],"published_at":"2026-08-21T03:35:42.708Z"},{"slug":"ZV-2026-0247","server_name":"engine-production-3bdc.up.railway.app","severity":"breaking","title":"engine-production-3bdc.up.railway.app: Type of requested_format on research_hook_evidence changed string → unset.","summary":"[risky] Optional field formats was added to research_hook_evidence; may shift model behaviour. [risky] Optional field requested_count_v2 was added to research_hook_evidence; may shift model behaviour. [risky] Optional field schema_version was added to research_hook_evidence; may shift model behaviour. [risky] Optional field source_requirements_v2 was added to research_hook_evidence; may shift model behaviour. [breaking] Type of requested_format on research_hook_evidence changed string → unset. [risky] Enum value null added to requested_format on research_hook_evidence.","changes":[{"kind":"input_property_added","path":"inputSchema.properties.formats","tool":"research_hook_evidence","after":{"anyOf":[{"type":"array","items":{"enum":["solo_talking_head","podcast","interview","yapping_monologue"],"type":"string"},"maxItems":4,"minItems":1},{"type":"null"}],"items":{"enum":["solo_talking_head","podcast","interview","yapping_monologue"],"type":"string"},"title":"Formats","default":null,"maxItems":4,"minItems":1,"description":"V2 allowed speaking formats. Omit for the four-format bundle."},"detail":"Optional field `formats` was added to `research_hook_evidence`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.requested_count_v2","tool":"research_hook_evidence","after":{"anyOf":[{"type":"integer","maximum":30,"minimum":1},{"type":"null"}],"title":"Requested Count V2","default":null,"maximum":30,"minimum":1,"description":"V2 maximum verified items, 1-30; omission defaults to 10."},"detail":"Optional field `requested_count_v2` was added to `research_hook_evidence`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.schema_version","tool":"research_hook_evidence","after":{"enum":["hook-research-request-v1","hook-research-request-v2"],"type":"string","title":"Schema Version","default":"hook-research-request-v1","description":"Use hook-research-request-v2 to opt into the V2 contract."},"detail":"Optional field `schema_version` was added to `research_hook_evidence`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.source_requirements_v2","tool":"research_hook_evidence","after":{"anyOf":[{"type":"array","items":{"$ref":"#/$defs/ResearchSourceRequirementInputV2"},"maxItems":3,"minItems":3},{"type":"null"}],"items":{"$ref":"#/$defs/ResearchSourceRequirementInputV2"},"title":"Source Requirements V2","default":null,"maxItems":3,"minItems":3,"description":"V2 per-platform quotas; omission prefers all three platforms."},"detail":"Optional field `source_requirements_v2` was added to `research_hook_evidence`; may shift model behaviour.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.requested_format","tool":"research_hook_evidence","after":"unset","before":"string","detail":"Type of `requested_format` on `research_hook_evidence` changed string → unset.","severity":"breaking"},{"kind":"enum_value_added","path":"inputSchema.properties.requested_format","tool":"research_hook_evidence","after":"null","detail":"Enum value `null` added to `requested_format` on `research_hook_evidence`.","severity":"risky"}],"published_at":"2026-08-21T02:33:39.049Z"},{"slug":"ZV-2026-0036","server_name":"engine-production-3bdc.up.railway.app","severity":"breaking","title":"engine-production-3bdc.up.railway.app: New required field beta_access_code on signup; requests without it will fail.","summary":"[safe] Description of add_credits changed (19% word delta). [risky] Description of create_checkout changed (46% word delta). [risky] Field request_limit was added to get_account output. [risky] Field requests_remaining was added to get_account output. [risky] Field requests_used was added to get_account output. [risky] Field tier was added to get_account output. [risky] Field unlimited was added to get_account output. [risky] Description of pricing changed (63% word delta). [risky] Field beta was added to pricing output. [safe] Description of score_hook changed (6% word delta). [safe] Description of score_hooks_batch changed (8% word delta). [risky] Description of signup changed (73% word delta). [breaking] New required field beta_access_code on signup; requests without it will fail. [breaking] Field idempotency_key on signup is now required. [breaking] Type of idempotency_key on signup changed unset → string. [risky] Default of idempotency_key on signup changed null → unset. [risky] Field request_limit was added to signup output. [risky] Field requests_remaining was added to signup output. [risky] Field requests_used was added to signup output. [risky] Field tier was added to signup output. [risky] Field unlimited was added to signup output.","changes":[{"kind":"description_changed","tool":"add_credits","after":"Compatibility credit grant (1-10000); beta customer operations are already free.\n\n        When VHGENGINE_ADMIN_KEY is configured on the deployment this requires a\n        matching admin_key argument; otherwise it stays self-serve (unless\n        VHGENGINE_FREE_CREDITS is off). Idempotent on idempotency_key (replay does NOT\n        grant twice). Returns {credits (new balance), granted}. Errors: unauthorized\n        (missing/wrong admin key or self-serve disabled), invalid_request (amount range\n        / balance ceiling), idempotency_conflict, rate_limited.\n        ","before":"Top up your credit balance (1-10000). Self-serve by default.\n\n        When VHGENGINE_ADMIN_KEY is configured on the deployment this requires a\n        matching admin_key argument; otherwise it stays self-serve (unless\n        VHGENGINE_FREE_CREDITS is off). Idempotent on idempotency_key (replay does NOT\n        grant twice). Returns {credits (new balance), granted}. Errors: unauthorized\n        (missing/wrong admin key or self-serve disabled), invalid_request (amount range\n        / balance ceiling), idempotency_conflict, rate_limited.\n        ","detail":"Description of `add_credits` changed (19% word delta).","severity":"safe","descriptionDelta":0.19354838709677424},{"kind":"description_changed","tool":"create_checkout","after":"Get a hosted-checkout link outside beta. Disabled while beta pricing is free.\n\n        When payments are enabled, hand checkout_url to your human and the webhook credits\n        the account after payment.\n        Args: pack (a credits amount from pricing.credit_packs), success_url/cancel_url\n        (optional), api_key (spend scope). Returns {checkout_url, pack, credits, usd_cents,\n        expires_at}. Errors: unauthorized, forbidden, invalid_request (bad pack),\n        payments_disabled (503; no checkout or top-up is needed during beta), rate_limited.\n        ","before":"Get a Stripe hosted-checkout link for a credit pack. You never touch a card (WP-PAY).\n\n        Hand the returned checkout_url to your human; the webhook credits you after they pay.\n        Args: pack (a credits amount from pricing.credit_packs), success_url/cancel_url\n        (optional), api_key (spend scope). Returns {checkout_url, pack, credits, usd_cents,\n        expires_at}. Errors: unauthorized, forbidden, invalid_request (bad pack),\n        payments_disabled (503; use add_credits), rate_limited.\n        ","detail":"Description of `create_checkout` changed (46% word delta).","severity":"risky","descriptionDelta":0.46376811594202894},{"kind":"output_property_added","path":"outputSchema.properties.request_limit","tool":"get_account","after":{"type":["number","null"],"description":"10 for standard; null for owner."},"detail":"Field `request_limit` was added to `get_account` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.requests_remaining","tool":"get_account","after":{"type":["number","null"],"description":"Remaining product requests; null for owner."},"detail":"Field `requests_remaining` was added to `get_account` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.requests_used","tool":"get_account","after":{"type":["number","null"],"description":"Product requests admitted so far."},"detail":"Field `requests_used` was added to `get_account` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.tier","tool":"get_account","after":{"type":["string","null"],"description":"owner (unlimited) or standard (ten product requests)."},"detail":"Field `tier` was added to `get_account` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.unlimited","tool":"get_account","after":{"type":["boolean","null"],"description":"true only for the owner tier."},"detail":"Field `unlimited` was added to `get_account` output.","severity":"risky"},{"kind":"description_changed","tool":"pricing","after":"The machine-readable price list, with per-mode expected_wait. Free, no auth.\n\n        Every customer operation is zero-priced during private beta. Returns {unit,\n        usd_per_credit:0, beta, operations, pricing_modes with zero base/per_hook,\n        expected_wait}. Internal provider-credit ceilings are separate from this list.\n        ","before":"The machine-readable price list, with per-mode expected_wait. Free, no auth.\n\n        Returns {unit, usd_per_credit (0 while credits are free), operations,\n        pricing_modes:{instant:{base:0,per_hook:1},smart:{base:0,per_hook:2},\n        research:{base:10,per_hook:4}} each with a formula, expected_wait, signup_grant,\n        low_balance_threshold}. A generate charge is base + per_hook * hooks_returned;\n        these are the exact constants the charge path uses.\n        ","detail":"Description of `pricing` changed (63% word delta).","severity":"risky","descriptionDelta":0.6271186440677966},{"kind":"output_property_added","path":"outputSchema.properties.beta","tool":"pricing","after":{"type":["object","null"],"description":"Private-beta contract: customer_pricing is the effective free or metered state, standard_request_limit 10, owner_request_limit null, access_code_required true."},"detail":"Field `beta` was added to `pricing` output.","severity":"risky"},{"kind":"description_changed","tool":"score_hook","after":"Score any hook text on 5 dimensions with rewrite tips. Free during beta.\n\n        Deterministic heuristic scorer (no LLM). Args: text (3-300), platform, topic\n        (optional, reproduces generate's score via the verbatim-echo penalty), tags (1-5\n        fleet slugs, WP-J), verbosity (full keeps per-dimension attribution), api_key,\n        idempotency_key (replay not re-charged). Returns {score:{...,total}, verdict,\n        suggestions, confidence, disclaimer, credits_charged, credits_remaining, request_id}.\n        Errors: unauthorized, invalid_request, insufficient_credits, rate_limited.\n        ","before":"Score any hook text on 5 dimensions with rewrite tips. 1 credit.\n\n        Deterministic heuristic scorer (no LLM). Args: text (3-300), platform, topic\n        (optional, reproduces generate's score via the verbatim-echo penalty), tags (1-5\n        fleet slugs, WP-J), verbosity (full keeps per-dimension attribution), api_key,\n        idempotency_key (replay not re-charged). Returns {score:{...,total}, verdict,\n        suggestions, confidence, disclaimer, credits_charged, credits_remaining, request_id}.\n        Errors: unauthorized, invalid_request, insufficient_credits, rate_limited.\n        ","detail":"Description of `score_hook` changed (6% word delta).","severity":"safe","descriptionDelta":0.06153846153846154},{"kind":"description_changed","tool":"score_hooks_batch","after":"Score many hooks ranked with `best`, or compare named SETS. Free during beta.\n\n        All-or-nothing charge. Plain: texts (1-25, each 3-300 chars). Self-test (E13):\n        compare=true + sets (2-4 named lists, <=25 texts total) INSTEAD of texts -> per-set\n        rankings + avg_score + winner + an honest winner_summary (same heuristic scorer\n        on every set, never view prediction). Also: platform, tags, verbosity, api_key,\n        idempotency_key. Returns {results, best, ...} or {sets, winner, winner_summary, ...}.\n        Errors: unauthorized, invalid_request, insufficient_credits, rate_limited.\n        ","before":"Score many hooks ranked with `best`, or compare named SETS. 1 credit per text.\n\n        All-or-nothing charge. Plain: texts (1-25, each 3-300 chars). Self-test (E13):\n        compare=true + sets (2-4 named lists, <=25 texts total) INSTEAD of texts -> per-set\n        rankings + avg_score + winner + an honest winner_summary (same heuristic scorer\n        on every set, never view prediction). Also: platform, tags, verbosity, api_key,\n        idempotency_key. Returns {results, best, ...} or {sets, winner, winner_summary, ...}.\n        Errors: unauthorized, invalid_request, insufficient_credits, rate_limited.\n        ","detail":"Description of `score_hooks_batch` changed (8% word delta).","severity":"safe","descriptionDelta":0.07692307692307687},{"kind":"description_changed","tool":"signup","after":"Redeem a private-beta code and create an account. No API key needed.\n\n        Standard codes are single-use with ten product requests. Owner codes are reusable\n        and unlimited. Signup retains 500 credits as a compatibility balance, while\n        customer pricing is zero during beta. An exact idempotent replay returns the same\n        account and same derived API key without a second redemption.\n        Errors: beta_access_denied, invalid_request, idempotency_conflict, rate_limited.\n        ","before":"Create an account and return your API key exactly once. No auth needed.\n\n        The entry point: an agent with nothing calls this and is productive immediately\n        (no CAPTCHA); new accounts get 500 credits. An idempotent replay returns the SAME\n        account with replayed:true and a NULL api_key (the plaintext is never stored), so\n        branch on `replayed`, never on the empty key. Cost: free.\n        Errors: invalid_request, idempotency_conflict, rate_limited.\n        ","detail":"Description of `signup` changed (73% word delta).","severity":"risky","descriptionDelta":0.7349397590361446},{"kind":"input_required_added","path":"inputSchema.properties.beta_access_code","tool":"signup","after":{"type":"string","title":"Beta Access Code","pattern":"^[0-9]{8}$","maxLength":8,"minLength":8,"description":"Private-beta invite code: exactly eight ASCII digits."},"detail":"New required field `beta_access_code` on `signup`; requests without it will fail.","severity":"breaking"},{"kind":"input_required_added","path":"inputSchema.required.idempotency_key","tool":"signup","detail":"Field `idempotency_key` on `signup` is now required.","severity":"breaking"},{"kind":"input_type_changed","path":"inputSchema.properties.idempotency_key","tool":"signup","after":"string","before":"unset","detail":"Type of `idempotency_key` on `signup` changed unset → string.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.idempotency_key","tool":"signup","before":null,"detail":"Default of `idempotency_key` on `signup` changed null → unset.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.request_limit","tool":"signup","after":{"type":["number","null"],"description":"10 for standard; null for owner."},"detail":"Field `request_limit` was added to `signup` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.requests_remaining","tool":"signup","after":{"type":["number","null"],"description":"Remaining product requests; null for owner."},"detail":"Field `requests_remaining` was added to `signup` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.requests_used","tool":"signup","after":{"type":["number","null"],"description":"Product requests admitted so far."},"detail":"Field `requests_used` was added to `signup` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.tier","tool":"signup","after":{"type":["string","null"],"description":"owner (unlimited) or standard (ten product requests)."},"detail":"Field `tier` was added to `signup` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.unlimited","tool":"signup","after":{"type":["boolean","null"],"description":"true only for the owner tier."},"detail":"Field `unlimited` was added to `signup` output.","severity":"risky"}],"published_at":"2026-08-14T19:01:35.466Z"},{"slug":"ZV-2026-0032","server_name":"engine-production-3bdc.up.railway.app","severity":"breaking","title":"engine-production-3bdc.up.railway.app: Type of minimum_acceptable_count on research_hook_evidence changed integer → unset.","summary":"[risky] Description of research_hook_evidence changed (25% word delta). [risky] Default of allow_partial on research_hook_evidence changed true → false. [breaking] Type of minimum_acceptable_count on research_hook_evidence changed integer → unset. [risky] Default of minimum_acceptable_count on research_hook_evidence changed 1 → null. [breaking] Type of status on research_hook_evidence changed string|null → unset. [breaking] status on research_hook_evidence narrowed to a closed enum (succeeded, insufficient_verified_supply, unsupported_cell, failed, degraded); previously valid values may now be rejected. [breaking] Type of delivered_count on research_hook_evidence changed integer|null → integer.","changes":[{"kind":"description_changed","tool":"research_hook_evidence","after":"Return a deterministic, unpadded portfolio of verified hook evidence.\n        Hard evidence gates precede relevance and diversity selection. Every delivered item is\n        independently audio_verified as the exact audible opener with a verified boundary and\n        timestamps; transcript-contained evidence remains internal. Views are observed platform\n        views, never an organic-views claim. New calls are exact-only; exact retained pre-strict\n        terminals may replay degraded or item-bearing insufficient_verified_supply. The default\n        runtime returns unsupported_cell without dispatch or charge until fully approved.\n        Errors: unauthorized, invalid_request, idempotency_conflict, and rate_limited.\n        ","before":"Return a deterministic, unpadded portfolio of verified hook evidence.\n        Hard evidence gates precede relevance and diversity selection. Every delivered item is\n        independently audio_verified as the exact audible opener with a verified boundary and\n        timestamps; transcript-contained evidence remains internal. Views are observed platform\n        views, never an organic-views claim. The default runtime returns unsupported_cell without\n        dispatch or charge until an approved provider runtime registers every required capability.\n        Errors: unauthorized, forbidden, invalid_request, idempotency_conflict,\n        insufficient_credits, rate_limited.\n        ","detail":"Description of `research_hook_evidence` changed (25% word delta).","severity":"risky","descriptionDelta":0.25},{"kind":"default_changed","path":"inputSchema.properties.allow_partial","tool":"research_hook_evidence","after":false,"before":true,"detail":"Default of `allow_partial` on `research_hook_evidence` changed true → false.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.minimum_acceptable_count","tool":"research_hook_evidence","after":"unset","before":"integer","detail":"Type of `minimum_acceptable_count` on `research_hook_evidence` changed integer → unset.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.minimum_acceptable_count","tool":"research_hook_evidence","after":null,"before":1,"detail":"Default of `minimum_acceptable_count` on `research_hook_evidence` changed 1 → null.","severity":"risky"},{"kind":"output_type_changed","path":"outputSchema.properties.status","tool":"research_hook_evidence","after":"unset","before":"string|null","detail":"Type of `status` on `research_hook_evidence` changed string|null → unset.","severity":"breaking"},{"kind":"enum_narrowed","path":"outputSchema.properties.status","tool":"research_hook_evidence","after":"enum[succeeded,insufficient_verified_supply,unsupported_cell,failed,degraded]","before":"open","detail":"`status` on `research_hook_evidence` narrowed to a closed enum (succeeded, insufficient_verified_supply, unsupported_cell, failed, degraded); previously valid values may now be rejected.","severity":"breaking"},{"kind":"output_type_changed","path":"outputSchema.properties.delivered_count","tool":"research_hook_evidence","after":"integer","before":"integer|null","detail":"Type of `delivered_count` on `research_hook_evidence` changed integer|null → integer.","severity":"breaking"}],"published_at":"2026-08-14T15:00:59.142Z"}]