{"id":"config-migration","title":"Migrate a v1 config to a v2 schema with an explicit mapping, and list what was dropped or defaulted","description":"Applies a declared mapping (from pointer, to pointer, optional transform such as string-to-number or a value map) to a v1 JSON config, carries over unmapped keys the v2 schema declares, fills schema defaults, validates the result against the v2 JSON Schema 2020-12 and returns the migrated config plus three exact lists: dropped (v1 values that landed nowhere, with their JSON pointers), defaulted (values invented from schema defaults) and invalid (v2 schema errors with paths). For agents upgrading a user's config file or tool settings between versions without silently losing data. Conflicting mappings, overlapping sources and lossy transforms (\"007\", numbers beyond 2^53, arrays with more than one element) are failures, not guesses. It does not infer mappings; unmapped and undeclared keys are reported as dropped.","roi":"Data loss during config upgrades is silent. 100 mappings and a 15,000-node config per $0.005 call.","audience":"developer","package":"data-contract-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/config-migration","path":"/api/v1/config-migration","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["v1","v2Schema","mapping"],"properties":{"v1":{"description":"The old config (any JSON value)."},"v2Schema":{"description":"The new config's schema. Full JSON Schema 2020-12 (local $ref only)."},"mapping":{"type":"array","maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["from"],"properties":{"from":{"type":"string","maxLength":300,"description":"JSON pointer in v1."},"to":{"type":"string","maxLength":300,"description":"JSON pointer in v2; omit with drop true."},"transform":{"type":"string","enum":["none","string-to-number","number-to-string","string-to-boolean","boolean-to-string","to-array","first-of-array","value-map"]},"valueMap":{"description":"Object of {stringified old value: new value} for transform value-map."},"drop":{"type":"boolean","description":"Acknowledge that this v1 value is intentionally discarded."}}}},"carryDeclared":{"type":"boolean","description":"Copy unmapped v1 values to the same pointer when v2 declares that property (default true)."},"applyDefaults":{"type":"boolean","description":"Fill missing v2 properties from schema defaults (default true)."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"migrated":{"description":"The v2 config."},"applied":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"transform":{"type":"string"}}}},"carried":{"type":"array","items":{"type":"string"},"description":"v1 pointers copied unchanged because v2 declares the same pointer."},"dropped":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The lost v1 value."}}}},"acknowledgedDrops":{"type":"array","items":{"type":"string"}},"defaulted":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The default that was inserted."}}}},"unusedMappings":{"type":"array","items":{"type":"string"},"description":"Mapping sources that do not exist in v1."},"invalid":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"keyword":{"type":"string"},"message":{"type":"string"}}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"migrated":{"description":"The v2 config."},"applied":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"transform":{"type":"string"}}}},"carried":{"type":"array","items":{"type":"string"},"description":"v1 pointers copied unchanged because v2 declares the same pointer."},"dropped":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The lost v1 value."}}}},"acknowledgedDrops":{"type":"array","items":{"type":"string"}},"defaulted":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The default that was inserted."}}}},"unusedMappings":{"type":"array","items":{"type":"string"},"description":"Mapping sources that do not exist in v1."},"invalid":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"keyword":{"type":"string"},"message":{"type":"string"}}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"v1":{"server":{"host":"db1","port":"5432","legacy_ssl":true},"debug":"yes","name":"x"},"v2Schema":{"type":"object","required":["database"],"additionalProperties":false,"properties":{"name":{"type":"string"},"database":{"type":"object","required":["host","port"],"properties":{"host":{"type":"string"},"port":{"type":"integer"},"timeoutMs":{"type":"integer","default":3000}}}}},"mapping":[{"from":"/server/host","to":"/database/host"},{"from":"/server/port","to":"/database/port","transform":"string-to-number"}]},"openapiOperation":{"operationId":"config_migration","summary":"Migrate a v1 config to a v2 schema with an explicit mapping, and list what was dropped or defaulted","description":"Applies a declared mapping (from pointer, to pointer, optional transform such as string-to-number or a value map) to a v1 JSON config, carries over unmapped keys the v2 schema declares, fills schema defaults, validates the result against the v2 JSON Schema 2020-12 and returns the migrated config plus three exact lists: dropped (v1 values that landed nowhere, with their JSON pointers), defaulted (values invented from schema defaults) and invalid (v2 schema errors with paths). For agents upgrading a user's config file or tool settings between versions without silently losing data. Conflicting mappings, overlapping sources and lossy transforms (\"007\", numbers beyond 2^53, arrays with more than one element) are failures, not guesses. It does not infer mappings; unmapped and undeclared keys are reported as dropped.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"developer","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/config-migration","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["v1","v2Schema","mapping"],"properties":{"v1":{"description":"The old config (any JSON value)."},"v2Schema":{"description":"The new config's schema. Full JSON Schema 2020-12 (local $ref only)."},"mapping":{"type":"array","maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["from"],"properties":{"from":{"type":"string","maxLength":300,"description":"JSON pointer in v1."},"to":{"type":"string","maxLength":300,"description":"JSON pointer in v2; omit with drop true."},"transform":{"type":"string","enum":["none","string-to-number","number-to-string","string-to-boolean","boolean-to-string","to-array","first-of-array","value-map"]},"valueMap":{"description":"Object of {stringified old value: new value} for transform value-map."},"drop":{"type":"boolean","description":"Acknowledge that this v1 value is intentionally discarded."}}}},"carryDeclared":{"type":"boolean","description":"Copy unmapped v1 values to the same pointer when v2 declares that property (default true)."},"applyDefaults":{"type":"boolean","description":"Fill missing v2 properties from schema defaults (default true)."}}},"example":{"v1":{"server":{"host":"db1","port":"5432","legacy_ssl":true},"debug":"yes","name":"x"},"v2Schema":{"type":"object","required":["database"],"additionalProperties":false,"properties":{"name":{"type":"string"},"database":{"type":"object","required":["host","port"],"properties":{"host":{"type":"string"},"port":{"type":"integer"},"timeoutMs":{"type":"integer","default":3000}}}}},"mapping":[{"from":"/server/host","to":"/database/host"},{"from":"/server/port","to":"/database/port","transform":"string-to-number"}]}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"migrated":{"description":"The v2 config."},"applied":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"transform":{"type":"string"}}}},"carried":{"type":"array","items":{"type":"string"},"description":"v1 pointers copied unchanged because v2 declares the same pointer."},"dropped":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The lost v1 value."}}}},"acknowledgedDrops":{"type":"array","items":{"type":"string"}},"defaulted":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"description":"The default that was inserted."}}}},"unusedMappings":{"type":"array","items":{"type":"string"},"description":"Mapping sources that do not exist in v1."},"invalid":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"keyword":{"type":"string"},"message":{"type":"string"}}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/config-migration/","docsJson":"https://agents.writerslogic.com/docs/config-migration.json","sample":"https://agents.writerslogic.com/api/v1/samples/config-migration","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}