[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NTH4DY9MPCACHZRYVM5ZAS":3,"skill-same:01M6NTH4DY9MPCACHZRYVM5ZAS":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":14,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M6NTH4DY9MPCACHZRYVM5ZAS","contract-testing-patterns",null,"Pact consumer-driven contracts, provider verification, schema evolution","rubicanjr\u002FFinCognis","rubicanjr","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F234912519?v=4","01M6NT156NND8J474G34SB3923","Rubi","01M6NT15B70RWXE1N3YV0BZY8A",0,"MIT","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fcontract-testing-patterns\u002Fskill.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41],"testing","testing patterns","patterns","contract","contract testing","contract testing patterns","verification","evolution","schema","provider","contracts","driven","pact","2026-11-10 10:12:30",false,"---\nname: contract-testing-patterns\ndescription: Pact consumer-driven contracts, provider verification, schema evolution\n---\n\n# Contract Testing Patterns\n\n## Consumer-Driven Contract Testing with Pact\n\n### Consumer Test (JavaScript)\n\n```javascript\nconst { PactV3, MatchersV3 } = require('@pact-foundation\u002Fpact');\nconst { like, eachLike, string, integer } = MatchersV3;\n\nconst provider = new PactV3({\n  consumer: 'OrderService',\n  provider: 'UserService',\n  logLevel: 'warn',\n});\n\ndescribe('User API Contract', () => {\n  it('returns user by ID', async () => {\n    await provider\n      .given('user with ID 1 exists')\n      .uponReceiving('a request for user 1')\n      .withRequest({\n        method: 'GET',\n        path: '\u002Fapi\u002Fusers\u002F1',\n        headers: { Accept: 'application\u002Fjson' },\n      })\n      .willRespondWith({\n        status: 200,\n        headers: { 'Content-Type': 'application\u002Fjson' },\n        body: {\n          id: integer(1),\n          name: string('Jane Doe'),\n          email: string('jane@example.com'),\n          roles: eachLike('admin'),\n        },\n      })\n      .executeTest(async (mockServer) => {\n        const client = new UserClient(mockServer.url);\n        const user = await client.getUser(1);\n        expect(user.id).toBe(1);\n        expect(user.name).toBeDefined();\n      });\n  });\n});\n```\n\n### Provider Verification\n\n```javascript\nconst { Verifier } = require('@pact-foundation\u002Fpact');\n\ndescribe('User Provider Verification', () => {\n  it('validates consumer contracts', async () => {\n    const verifier = new Verifier({\n      providerBaseUrl: 'http:\u002F\u002Flocalhost:3000',\n      pactBrokerUrl: process.env.PACT_BROKER_URL,\n      pactBrokerToken: process.env.PACT_BROKER_TOKEN,\n      provider: 'UserService',\n      providerVersion: process.env.GIT_SHA,\n      providerVersionBranch: process.env.GIT_BRANCH,\n      publishVerificationResult: true,\n      stateHandlers: {\n        'user with ID 1 exists': async () => {\n          await db.users.create({ id: 1, name: 'Jane Doe', email: 'jane@example.com' });\n        },\n        'no users exist': async () => {\n          await db.users.deleteAll();\n        },\n      },\n    });\n    await verifier.verifyProvider();\n  });\n});\n```\n\n### Schema Evolution Rules\n\n```yaml\n# Backward Compatible (SAFE):\n- Adding optional fields\n- Adding new endpoints\n- Widening accepted value ranges\n- Adding new enum values (if consumer ignores unknown)\n\n# Breaking Changes (UNSAFE):\n- Removing fields\n- Renaming fields\n- Changing field types\n- Making optional fields required\n- Narrowing accepted value ranges\n- Removing endpoints\n```\n\n### Can-I-Deploy Check\n\n```bash\n# Before deploying consumer\npact-broker can-i-deploy \\\n  --pacticipant OrderService \\\n  --version $GIT_SHA \\\n  --to-environment production\n\n# Before deploying provider\npact-broker can-i-deploy \\\n  --pacticipant UserService \\\n  --version $GIT_SHA \\\n  --to-environment production\n```\n\n## Checklist\n\n- [ ] Every external API dependency has a consumer contract\n- [ ] Provider state handlers seed realistic test data\n- [ ] Contracts published to Pact Broker with git SHA version\n- [ ] `can-i-deploy` gate in CI pipeline before deploy\n- [ ] Provider verification runs on every PR\n- [ ] Breaking change detection automated\n- [ ] Contract tests run in under 30 seconds\n- [ ] Webhook configured to trigger provider verification on new pact\n\n## Anti-Patterns\n\n- Testing provider internal logic in consumer tests\n- Using exact matchers instead of type matchers (brittle)\n- Skipping provider states (tests pass but don't reflect reality)\n- Not versioning contracts with git SHA\n- Running contract tests against shared environments\n- Coupling consumer tests to provider implementation details\n- Ignoring `can-i-deploy` failures\n","# Contract Testing Patterns\n\n## Consumer-Driven Contract Testing with Pact\n\n### Consumer Test (JavaScript)\n\n```javascript\nconst { PactV3, MatchersV3 } = require('@pact-foundation\u002Fpact');\nconst { like, eachLike, string, integer } = MatchersV3;\n\nconst provider = new PactV3({\n  consumer: 'OrderService',\n  provider: 'UserService',\n  logLevel: 'warn',\n});\n\ndescribe('User API Contract', () => {\n  it('returns user by ID', async () => {\n    await provider\n      .given('user with ID 1 exists')\n      .uponReceiving('a request for user 1')\n      .withRequest({\n        method: 'GET',\n        path: '\u002Fapi\u002Fusers\u002F1',\n        headers: { Accept: 'application\u002Fjson' },\n      })\n      .willRespondWith({\n        status: 200,\n        headers: { 'Content-Type': 'application\u002Fjson' },\n        body: {\n          id: integer(1),\n          name: string('Jane Doe'),\n          email: string('jane@example.com'),\n          roles: eachLike('admin'),\n        },\n      })\n      .executeTest(async (mockServer) => {\n        const client = new UserClient(mockServer.url);\n        const user = await client.getUser(1);\n        expect(user.id).toBe(1);\n        expect(user.name).toBeDefined();\n      });\n  });\n});\n```\n\n### Provider Verification\n\n```javascript\nconst { Verifier } = require('@pact-foundation\u002Fpact');\n\ndescribe('User Provider Verification', () => {\n  it('validates consumer contracts', async () => {\n    const verifier = new Verifier({\n      providerBaseUrl: 'http:\u002F\u002Flocalhost:3000',\n      pactBrokerUrl: process.env.PACT_BROKER_URL,\n      pactBrokerToken: process.env.PACT_BROKER_TOKEN,\n      provider: 'UserService',\n      providerVersion: process.env.GIT_SHA,\n      providerVersionBranch: process.env.GIT_BRANCH,\n      publishVerificationResult: true,\n      stateHandlers: {\n        'user with ID 1 exists': async () => {\n          await db.users.create({ id: 1, name: 'Jane Doe', email: 'jane@example.com' });\n        },\n        'no users exist': async () => {\n          await db.users.deleteAll();\n        },\n      },\n    });\n    await verifier.verifyProvider();\n  });\n});\n```\n\n### Schema Evolution Rules\n\n```yaml\n# Backward Compatible (SAFE):\n- Adding optional fields\n- Adding new endpoints\n- Widening accepted value ranges\n- Adding new enum values (if consumer ignores unknown)\n\n# Breaking Changes (UNSAFE):\n- Removing fields\n- Renaming fields\n- Changing field types\n- Making optional fields required\n- Narrowing accepted value ranges\n- Removing endpoints\n```\n\n### Can-I-Deploy Check\n\n```bash\n# Before deploying consumer\npact-broker can-i-deploy \\\n  --pacticipant OrderService \\\n  --version $GIT_SHA \\\n  --to-environment production\n\n# Before deploying provider\npact-broker can-i-deploy \\\n  --pacticipant UserService \\\n  --version $GIT_SHA \\\n  --to-environment production\n```\n\n## Checklist\n\n- [ ] Every external API dependency has a consumer contract\n- [ ] Provider state handlers seed realistic test data\n- [ ] Contracts published to Pact Broker with git SHA version\n- [ ] `can-i-deploy` gate in CI pipeline before deploy\n- [ ] Provider verification runs on every PR\n- [ ] Breaking change detection automated\n- [ ] Contract tests run in under 30 seconds\n- [ ] Webhook configured to trigger provider verification on new pact\n\n## Anti-Patterns\n\n- Testing provider internal logic in consumer tests\n- Using exact matchers instead of type matchers (brittle)\n- Skipping provider states (tests pass but don't reflect reality)\n- Not versioning contracts with git SHA\n- Running contract tests against shared environments\n- Coupling consumer tests to provider implementation details\n- Ignoring `can-i-deploy` failures\n",{"name":5,"description":7},"main","70e1c350500ee750987420bbae48837afa906b7e","skills\u002Fcontract-testing-patterns","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis","https:\u002F\u002Fgithub.com\u002Frubicanjr","linktr.ee\u002Ffinanskodu","Industrial Engineer & CIO @FinansKodu. Architecting AI-driven financial agents and autonomous workflows. 🏗️ Building systems, not just prompts.","2026-06-09 13:50:15",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add rubicanjr\u002FFinCognis --skill contract-testing-patterns",{"tool":61,"command":62},"bunx","bunx skills add rubicanjr\u002FFinCognis --skill contract-testing-patterns",{"tool":64,"command":65},"pnpm","pnpm dlx skills add rubicanjr\u002FFinCognis --skill contract-testing-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fcontract-testing-patterns\u002Fskill.md",true,[],[70,89,97,116,146,165],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":79,"publishedAt":42},"01M6NWS9DAXJTADT4T5MB49X8W","workflow-router","Goal-based workflow orchestration - routes tasks to specialist agents based on user goals","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-router\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[80,81,82,83,84,85,86,87,88],"workflow router","workflow","router","orchestration","goals","goal","user","workflow orchestration","tasks",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":42},"01M6NWS3RETSC0SHP16HP66E14","wiring","Wiring Verification","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fwiring\u002FSKILL.md",[],[91,35,96],"false",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":106,"publishedAt":42},"01M6NWS0XW9CVQZBDA1EGW0TWC","websocket-patterns","Connection management, room patterns, reconnection strategies, message buffering, and binary protocol design.","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fwebsocket-patterns\u002Fskill.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[107,31,108,109,110,111,112,113,114,115],"websocket","websocket patterns","design","protocol","management","message","strategies","binary","connection",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":126,"publishedAt":42},"01M6NWRDQDX9ZNETAWRRMQWV52","visual-verdict","Screenshot comparison QA for frontend development. Takes a screenshot of the current implementation, scores it across multiple visual dimensions, and returns a structured PASS\u002FREVISE\u002FFAIL verdict with concrete fixes. Use when implementing UI from a design reference or verifying visual correctness.","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fvisual-verdict\u002FSKILL.md",[122,125],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":77,"categoryName":78,"taxonomyType":21,"taxonomyTypeDesc":22},[127,128,129,130,131,132,133,134,135,136,137,138,139,109,140,141,142,143,144,145],"visual","verdict","visual verdict","ui","across","revise","comparison","correctness","implementing","for","fixes","dimensions","frontend","development","qa","screenshot","returns","use","frontend development",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":42},"01M6NWR8HSNRS7MNDK2J02QYMN","verification-loop","Comprehensive verification system covering build, types, lint, tests, security, and diff review before a PR.","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[153,154,35,155,156,157,158,159,160,161,162,163,164],"verification loop","loop","lint","review","security","pr","system","diff","build","tests","diff review","types",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":42},"01M6NWR4HHSFR0VR5EXFRWA747","vector-db-patterns","Embedding strategies, ANN algorithms, hybrid search, RAG chunking strategies, and reranking for semantic search and retrieval.","https:\u002F\u002Fgithub.com\u002Frubicanjr\u002FFinCognis\u002Fblob\u002Fmain\u002Fskills\u002Fvector-db-patterns\u002Fskill.md",[],[172,173,174,175,31,176,177,178,179,113,180,181,182,183,184,136,185,186],"vector db patterns","vector db","db","vector","semantic search","search","embedding strategies","algorithms","chunking","semantic","retrieval","embedding","Hybrid Search","hybrid","rag"]