Main Baseline
Clean baseline: no drift expected
main @specferret/cli@0.2.0 · 12 scenarios · 2 repos
Every release must pass all 12 scenarios against the live npm package in two external validation repositories before publish. Manifests are fetched live from GitHub at build time.
Clean baseline: no drift expected
main Breaking: expiresAt removed from auth.jwt required fields. api.GET/search and event.user-action both import auth.jwt and are flagged at depth 1.
scenario/breaking-required-field Breaking: token field type changed from string to integer in auth.jwt. Type changes are always classified as breaking.
scenario/breaking-type-change Non-breaking: refreshToken optional field added to auth.jwt properties. Not in required list. ferret classifies as non-breaking — node stays stable, lint exits 0.
scenario/nonbreaking-optional-add Breaking with transitive depth: auth.jwt loses expiresAt (breaking). api.GET/search and event.user-action flagged at depth 1 (breaking count). api.GET/recommendations imports api.GET/search and is flagged at depth 2 (nonBreaking count).
scenario/transitive-impact-depth Post-review clean state: repository includes explicit evidence artifacts for accept/update/reject decisions and asserts they are present during scenario checks.
scenario/review-resolution-flow Code-first extraction (0.1.4+): src/auth/jwt.ts uses a @ferret-contract source annotation instead of the legacy codeFile frontmatter field. ferret extract is driven by codeContracts.include in ferret.config.json. Scenario asserts extract determinism by running ferret extract twice and requiring byte-identical generated contracts.
scenario/code-first-extract Opinionated layout validation: contracts follow the spec-kit folder structure (contracts/<domain>/<name>.contract.md). ferret.config.json uses the lint-first workflow. All contracts are stable and in sync with context.json. Lint exits 0.
scenario/specferret-opinionated-layout Agent mode scaffolding (0.1.4+): ferret init --agent-targets claude,copilot,gemini creates canonical agent rules and adapter instruction packs. Scenario asserts clean lint after init and that all expected scaffolding files are present.
scenario/agent-mode-init Breaking: scope field added to auth.jwt required array. Adding a required field breaks existing consumers who do not provide it. Covers S04 breaking class: required field added. Expects auth.jwt flagged as trigger with downstream contracts at depth 1.
scenario/breaking-required-field-added No-op formatting change: auth.jwt properties are reordered (expiresAt first). Zero semantic change. ferret hashSchema uses key-sorted canonical JSON so property ordering produces identical hashes. Asserts exit 0 and clean drift class — proves false-positive protection (S03 hash stability).
scenario/noop-no-drift Breaking with depth-3 transitive chain: auth.jwt loses expiresAt (breaking). api.GET/search and event.user-action flagged at depth 1. api.GET/recommendations flagged at depth 2. api.GET/trending (imports api.GET/recommendations) flagged at depth 3. Proves BFS traversal does not truncate beyond depth 2.
scenario/depth-3-chain