Product Kit · 1.0.0
Contract Release Gate Kit
Gate one bounded JSON Schema, tool contract, or OpenAPI operation release with direction-aware compatibility and fixture evidence.
API and agent-tool teams that need a deterministic release decision without replaying calls or executing submitted code.
Release-gate envelope
{
"ok": true,
"schema_version": "utilito.product-kit.v1",
"kit": {
"id": "contract-release-gate-kit",
"version": "1.0.0"
},
"result": {
"decision": "pass",
"status": "passed",
"compatibility": {
"taxonomy": [
"breaking",
"non_breaking",
"unknown"
],
"supported_subset": "Conservative bounded subset: string type only (unions invalid), properties, required, additionalProperties boolean, items, enum, and const. title/description/default are annotation-only. Every changed unsupported keyword is unknown. Output property additions are non-breaking for tolerant consumers unless the previous output schema explicitly closed additionalProperties; then they are breaking.",
"rows": [
{
"path": "input:$.properties[\"count\"]",
"change": "property_added",
"classification": "non_breaking"
}
],
"counts": {
"breaking": 0,
"non_breaking": 1,
"unknown": 0,
"total": 1
}
},
"fixture_results": [
{
"id": "request-accepted",
"target": "input",
"actual": {
"outcome": "accepted"
},
"expected": {
"outcome": "accepted"
},
"passed": true
}
],
"fixture_summary": {
"passed": 1,
"failed": 0,
"total": 1
},
"assertions": {
"kind": "artifact_snapshot_assertions",
"specs": [
{
"id": "compatibility-count-total",
"invariant": "total equals breaking + non_breaking + unknown"
},
{
"id": "fixture-count-total",
"invariant": "total equals passed + failed"
},
{
"id": "decision-status-policy",
"invariant": "decision and status agree with counts, fixture failures, and policy"
},
{
"id": "row-summary-consistency",
"invariant": "row summaries are stable and reproduce compatibility counts"
},
{
"id": "fixture-summary-consistency",
"invariant": "fixture summaries are stable and reproduce fixture counts"
}
],
"node_source": "'use strict';\n// Validates generated gate artifact consistency only; it does not validate submitted schemas, execute tools, read files, or use a network.\nconst artifact={\"kind\":\"artifact_snapshot_assertions\",\"snapshot\":{\"decision\":\"pass\",\"status\":\"passed\",\"policy\":{\"unknown_changes\":\"review\",\"fixture_failures\":\"block\"},\"compatibility_counts\":{\"breaking\":0,\"non_breaking\":1,\"unknown\":0,\"total\":1},\"fixture_summary\":{\"passed\":1,\"failed\":0,\"total\":1},\"row_summaries\":[{\"value\":{\"path\":\"input:$.properties[\\\"count\\\"]\",\"change\":\"property_added\",\"classification\":\"non_breaking\"},\"stable_key\":\"{\\\"change\\\":\\\"property_added\\\",\\\"classification\\\":\\\"non_breaking\\\",\\\"path\\\":\\\"input:$.properties[\\\\\\\"count\\\\\\\"]\\\"}\"}],\"fixture_result_summaries\":[{\"value\":{\"id\":\"request-accepted\",\"target\":\"input\",\"actual\":{\"outcome\":\"accepted\"},\"expected\":{\"outcome\":\"accepted\"},\"passed\":true},\"stable_key\":\"{\\\"actual\\\":{\\\"outcome\\\":\\\"accepted\\\"},\\\"expected\\\":{\\\"outcome\\\":\\\"accepted\\\"},\\\"id\\\":\\\"request-accepted\\\",\\\"passed\\\":true,\\\"target\\\":\\\"input\\\"}\"}]},\"specs\":[{\"id\":\"compatibility-count-total\",\"invariant\":\"total equals breaking + non_breaking + unknown\"},{\"id\":\"fixture-count-total\",\"invariant\":\"total equals passed + failed\"},{\"id\":\"decision-status-policy\",\"invariant\":\"decision and status agree with counts, fixture failures, and policy\"},{\"id\":\"row-summary-consistency\",\"invariant\":\"row summaries are stable and reproduce compatibility counts\"},{\"id\":\"fixture-summary-consistency\",\"invariant\":\"fixture summaries are stable and reproduce fixture counts\"}]};\nconst stable=(v)=>Array.isArray(v)?'['+v.map(stable).join(',')+']':v&&typeof v==='object'?'{'+Object.keys(v).sort().map(k=>JSON.stringify(k)+':'+stable(v[k])).join(',')+'}':JSON.stringify(v);\nconst fail=(id)=>{throw new Error('Generated gate artifact consistency failed: '+id)};\nconst s=artifact.snapshot,c=s.compatibility_counts,f=s.fixture_summary;\nif(c.total!==c.breaking+c.non_breaking+c.unknown)fail('compatibility-count-total');\nif(f.total!==f.passed+f.failed)fail('fixture-count-total');\nlet decision='pass';if(c.breaking)decision='block';else if(c.unknown)decision=s.policy.unknown_changes;if(f.failed&&(s.policy.fixture_failures==='block'||decision==='pass'))decision=s.policy.fixture_failures;\nif(s.decision!==decision||s.status!==({pass:'passed',block:'blocked',review:'review_required'})[decision])fail('decision-status-policy');\nfor(const summary of [...s.row_summaries,...s.fixture_result_summaries])if(stable(summary.value)!==summary.stable_key)fail('result-summary-stability');\nconst rowCounts={breaking:0,non_breaking:0,unknown:0};for(const summary of s.row_summaries){const kind=summary.value.classification;if(!Object.hasOwn(rowCounts,kind))fail('row-classification');rowCounts[kind]++}if(s.row_summaries.length!==c.total||rowCounts.breaking!==c.breaking||rowCounts.non_breaking!==c.non_breaking||rowCounts.unknown!==c.unknown)fail('row-summary-consistency');\nconst passed=s.fixture_result_summaries.filter(x=>x.value.passed===true).length;if(s.fixture_result_summaries.length!==f.total||passed!==f.passed||f.failed!==f.total-passed)fail('fixture-summary-consistency');\nconsole.log(JSON.stringify({ok:true,status:'artifact_snapshot_assertions_passed',assertions:artifact.specs.length}));\n"
},
"retry_risk_notes": [],
"safe_actions": [
{
"code": "REVIEW_COMPATIBILITY_MATRIX",
"message": "Review the bounded direction-aware matrix before release.",
"automatic": false
}
],
"report": {
"format": "markdown",
"mime_type": "text/markdown",
"mode": "details",
"contains_raw_values": false,
"content": "# Contract Release Gate report\n\nDecision: **pass**\n\nCompatibility counts: breaking 0; non-breaking 1; unknown 0.\nFixture counts: passed 1; failed 0; total 1.\n\nPrivacy mode: details; paths and fixture IDs included, values and schemas omitted.\n\n## Compatibility matrix\n\n- non\\_breaking · property\\_added · input:$\\.properties\\[\"count\"\\]\n\n## Fixture results\n\n- request\\-accepted · input · passed\n"
},
"tool_execution": false,
"outbound_replay": false,
"github_writeback": false,
"scheduled": false,
"monitoring": false
},
"receipt": {
"input_bytes": 593,
"output_bytes": 5754,
"operations": 4,
"omitted_items": 0,
"warnings": [],
"contracts": 2,
"fixtures": 1,
"matrix_rows": 1,
"assertion_specs": 5
},
"provenance": {
"deterministic": true,
"model_used": false,
"network_used": false,
"storage_used": false,
"core_versions": {
"contract_release_gate_kit": "1.0.0",
"contract_matrix": "1.0.0"
}
},
"error": null
}Free runnable capability
Gate one bounded contract pair with up to 50 fixtures, assertions, and a safe report with no signup.
Builder capability
The existing Builder Pilot adds higher bounded volume and batch contract sets; it does not add tool replay, GitHub write-back, schedules, monitoring, or hidden retries.
See the existing Builder PilotResponse-only privacy
Submitted contracts and fixture values are sent only to the response-only API when you select Build release gate; they are not stored, replayed, executed, fetched, or sent to a model.
Limits and trust boundary
- Comparison is intentionally limited to type, properties, required, boolean additionalProperties, items, enum, and const; changed unsupported semantic keywords are unknown and $ref is rejected rather than resolved.
- Fixtures validate only the selected current inline schema. Expected typed errors are limited to SCHEMA_VALIDATION_FAILED; no application behavior or tool is executed.
- Generated Node source asserts the returned artifact snapshot only. It is not a schema validator, tool runner, replay mechanism, or caller-code execution path.
- Metadata reports omit paths and fixture IDs; detail reports include those labels but never raw fixture values or complete schemas.