# Contributor handoff — pact-foundation/pact-js

> Canonical page: https://codevetter.com/unpack/pact-js/agent-handoff

# Contributor handoff — pact-foundation/pact-js

Scanned commit 18f30a1aa44a948b3249a72879da3cff26c42d12 (2026-10-02). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

Tests and CI were inspected, not executed, and this inventory is bounded rather than exhaustive. Begin future work at the public export and the specific generation of API being changed, then follow its native calls and lifecycle tests. Preserve compatibility, inspect npm lifecycle side effects before requesting execution, and use source behavior to resolve documentation drift.
- Read src/index.ts, src/v4/index.ts, and the migration import table first: unqualified Pact now means V4 and Matchers means V3, while PactV2 preserves the older HTTP interface. — [src/index.ts#L66-L98](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/index.ts#L66-L98) [src/v4/index.ts#L95-L98](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/index.ts#L95-L98) [docs/migrations/16.md#L12-L23](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/docs/migrations/16.md#L12-L23)
- Use the root package's Node >=22 requirement for this checkout; README still describes Node 16+ for v12 and example manifests advertise >=20, so those older statements do not establish current root support. — [package.json#L35-L37](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/package.json#L35-L37) [README.md#L100-L106](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/README.md#L100-L106) [examples/http/package.json#L11-L15](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/examples/http/package.json#L11-L15) [.github/workflows/test.yml#L119-L127](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/.github/workflows/test.yml#L119-L127)
- Formatting conventions are Biome, single-quoted JavaScript, and two-space LF files; npm run check composes format and lint, and lint includes tsc --noEmit. CONTRIBUTING requests tests and separation of unrelated changes. — [biome.jsonc#L3-L20](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/biome.jsonc#L3-L20) [.editorconfig#L6-L13](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/.editorconfig#L6-L13) [package.json#L13-L21](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/package.json#L13-L21) [CONTRIBUTING.md#L74-L85](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/CONTRIBUTING.md#L74-L85)
- For later authorized validation, select the affected Vitest spec before broad suites; src/v4/http/index.spec.ts targets transport configuration and hooks.spec.ts targets interaction-boundary behavior. Neither these tests nor configured CI jobs were executed in this investigation. — [package.json#L23-L24](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/package.json#L23-L24) [src/v4/http/index.spec.ts#L25-L124](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/http/index.spec.ts#L25-L124) [src/dsl/verifier/proxy/hooks.spec.ts#L24-L117](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/dsl/verifier/proxy/hooks.spec.ts#L24-L117) [.github/workflows/test.yml#L139-L152](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/.github/workflows/test.yml#L139-L152)
- Inspect lifecycle scripts before execution: root npm test downloads/installs plugins under ~/.pact, regression npm test removes pact directories, and the plugin example's pretest invokes a CLI command whose failure is suppressed with || true. — [package.json#L23-L25](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/package.json#L23-L25) [scripts/install-plugins.js#L56-L98](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/scripts/install-plugins.js#L56-L98) [regression/package.json#L4-L8](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/regression/package.json#L4-L8) [examples/plugins/package.json#L6-L11](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/examples/plugins/package.json#L6-L11)
- Preserve consumer-before-provider sequencing: example and regression npm test commands generate contracts first, provider examples read those generated pact paths, and regression configs alias the SDK to local TypeScript source. — [examples/http/package.json#L6-L9](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/examples/http/package.json#L6-L9) [examples/http/provider.test.ts#L31-L35](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/examples/http/provider.test.ts#L31-L35) [regression/package.json#L4-L8](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/regression/package.json#L4-L8) [regression/vitest.config.consumer.ts#L4-L8](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/regression/vitest.config.consumer.ts#L4-L8)
- Keep message envelopes generation-specific: legacy MessageConsumerPact delivers contents directly, V4 async adapters extract contents.content, and synchronous V4 callbacks expose Request.content plus Response[].content. — [src/messageConsumerPact.ts#L200-L214](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/messageConsumerPact.ts#L200-L214) [src/messageConsumerPact.ts#L237-L264](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/messageConsumerPact.ts#L237-L264) [src/v4/message/index.ts#L455-L465](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/message/index.ts#L455-L465) [src/v4/message/index.ts#L494-L517](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/message/index.ts#L494-L517)
- Review reset timing when changing synchronous execution: SynchronousMessageWithResponse.executeTest invokes cleanupFn immediately after starting executeNonTransportTest, whose completion cleanup invokes it again; the supplied callback recreates the PactV4 handle. — [src/v4/message/index.ts#L407-L442](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/message/index.ts#L407-L442) [src/v4/message/index.ts#L470-L480](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/message/index.ts#L470-L480) [src/v4/index.ts#L50-L63](https://github.com/pact-foundation/pact-js/blob/18f30a1aa44a948b3249a72879da3cff26c42d12/src/v4/index.ts#L50-L63)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
