ripple

v1.0.0

Detect side effects that tests can't catch after implementation — delta-anchored analysis across 9 domain-agnostic categories with fix-induced side effect detection

Community extension — Independently maintained. Use at your own discretion. Learn more

Ripple

Detect side effects that tests can't catch after implementation.

Spec Kit >= 0.2.0 Version 1.0.0 License MIT

A Spec Kit community extension that analyzes your implementation for hidden ripple effects — the kind of side effects that pass all tests but break things in production.

The Problem

Tests verify intended behavior. But every code change creates ripple effects that tests aren't designed to catch:

  • A function signature looks the same, but its return value means something different now
  • A new dependency introduces a subtle ordering constraint
  • A refactored module now holds onto resources longer than before
  • An async operation that used to complete in time no longer does under load

These issues hide in the gap between "all tests pass" and "production is stable."

What Ripple Does

Ripple is not a general code review. It compares your implementation against the baseline (branch point) and asks: "What did this change break or put at risk that wasn't broken before?"

Every finding is delta-anchored — causally linked to a specific change in your diff, with a clear before/after description. Pre-existing issues are out of scope.

It analyzes across 9 categories:

CategoryWhat It Catches
Data FlowInput/output shape mismatches, silent data loss, serialization gaps
State & LifecycleGlobal state pollution, resource leaks, initialization order issues
Interface ContractSemantic signature changes, broken implicit contracts
Resource & PerformanceComplexity regressions, hot-path allocations, I/O amplification
ConcurrencyRace conditions, lock ordering, atomicity assumptions
Distributed CoordinationIdempotency gaps, ordering assumptions, partition tolerance
Configuration & EnvironmentMissing config keys, environment-specific gaps, deploy ordering
Error PropagationUnhandled failure modes, silent swallowing, partial failure states
ObservabilityLost trace context, logging gaps, broken metrics

Categories are domain-agnostic — they apply whether you're building a web API, CLI tool, mobile app, embedded system, data pipeline, or anything else. Security concerns (access control bypass, sensitive data exposure, privilege escalation) are covered as a cross-cutting lens within relevant categories rather than as a separate category. Domain-specific details are inferred from the actual codebase — Ripple adapts its analysis to the project's technology stack automatically.

Example Finding

Each finding traces a causal chain from the change to its impact:

#### R-001: Config file allows 20MB uploads but controller rejects above 10MB

- **Category**: Configuration & Environment / Interface Contract
- **Cause**: `application.yml` max-file-size raised to 20MB, but controller
  still has `MAX_IMAGE_SIZE = 10MB` hardcoded
- **Before**: Both limits were 10MB — consistent, uploads above 10MB rejected
- **After**: Multipart accepts 20MB but controller immediately rejects >10MB
  with a 400 error. The config change has no effect.
- **Why Tests Miss It**: Tests use small fixtures; boundary tests at 10-20MB
  range don't exist
- **Recommendation**: Unify to a single config source
- **Status**: OPEN

Fix-Induced Detection

Fixes can create new problems. Ripple tracks this by re-scanning after each fix cycle:

1st scan:  3 critical, 5 warning, 3 info    → fix all
2nd scan:  1 critical, 4 warning, 6 info    → new issues from fixes
3rd scan:  0 critical, 1 warning, 4 info    → converging

This loop continues until findings stabilize. The check command explicitly scans for side effects introduced by the fixes themselves.

Installation

specify extension add ripple

From repository directly:

specify extension add ripple --from https://github.com/chordpli/spec-kit-ripple/archive/refs/tags/v1.0.0.zip

Commands

/speckit.ripple.scan

Analyze implementation for untested side effects.

/speckit.ripple.scan              # Full scan, all severities
/speckit.ripple.scan critical     # Critical findings only
/speckit.ripple.scan --diff       # Incremental scan on changed files

Produces: specs/{feature}/ripple-report.md

/speckit.ripple.resolve

Interactively walk through findings and decide how to fix each one.

/speckit.ripple.resolve             # Resolve all open findings, CRITICAL first
/speckit.ripple.resolve critical    # Resolve critical findings only
/speckit.ripple.resolve R-001 R-003 # Resolve specific findings
/speckit.ripple.resolve --dry-run   # Preview options without recording decisions

For each finding, Ripple presents:

  1. The cause (what changed) and the side effect (what's at risk)
  2. 2-4 concrete resolution options with tradeoffs (minimal fix, structural fix, skip)
  3. A recommended option with reasoning

You pick an option, describe your own approach, or skip. Decisions are recorded in ripple-report.md, and fix plans are saved to specs/{feature}/ripple-fixes.md — ready for /speckit.implement to consume.

/speckit.ripple.check

Re-verify findings after fixes have been applied.

/speckit.ripple.check             # Re-check all open findings
/speckit.ripple.check critical    # Re-check critical findings only
/speckit.ripple.check R-001 R-005 # Re-check specific findings

Updates: existing ripple-report.md with resolution status

Crucially, check also detects fix-induced side effects — new problems created by the fixes themselves. If a fix introduced a new risk, check will catch it and add it as a new finding.

Hook

Ripple hooks into after_implement — after running /speckit.implement, you'll be prompted:

Scan for untested side effects? (y/n)

Workflow Position

/speckit.specify                        → spec.md
/speckit.clarify                        → clarifications
/speckit.plan                           → plan.md
/speckit.tasks                          → tasks.md
/speckit.implement                      → code
                                          ↓ after_implement hook (optional)
┌──  /speckit.ripple.scan               → ripple-report.md  ★
│    /speckit.ripple.resolve            → ripple-fixes.md   ★
│    Implement fixes
│    /speckit.ripple.check              → updated report    ★
│              ↓
└── New findings? → loop back
                                          ↓ No
/speckit.checklist                      → verify
Merge with confidence

Spec Kit's core workflow goes from /speckit.implement directly to merge. This extension inserts a feedback loop after implementation: scan for side effects, decide how to fix them, verify the fixes, and repeat until findings stabilize.

Artifacts

FileCreated byPurpose
specs/{feature}/ripple-report.mdscan, updated by resolve and checkSide effect findings, resolution history, check history
specs/{feature}/ripple-fixes.mdresolveImplementation guidance for each fix — bridge to /speckit.implement

Severity Levels

LevelMeaning
CRITICALCould cause data loss, security breach, or system outage in production
WARNINGLikely to cause bugs, degraded performance, or operational issues
INFOPotential concern worth reviewing — may be intentional or low-risk

Complementary Perspectives

Three post-implementation extensions share the after_implement hook. Each addresses a distinct concern:

reviewstaff-reviewripple
FocusCode qualityShipping readinessChange impact
AnalyzesChanged code (quality, tests, types, error handling)Changed code vs. spec (security, performance, coverage)Unmodified code affected by changes
Finding depthConciseConcise with verdictDetailed — causation, before/after, blast radius
Catches uniquelyDesign flaws, code style, pre-existing vulnerabilities, process gapsSpec adherence gaps, overall test absence, ship/hold decisionFix-induced regressions, causal chains across changes, implicit contract shifts

When run on the same change set, findings fall into three groups:

  • Overlap — all tools catch the issue, but from different angles. Review flags it concisely; Ripple traces the causal chain (which change introduced it, what it looked like before, what's at risk now).
  • Review/staff-review only — pre-existing risks, design quality, validation logic errors, overall test absence, process gaps. Outside Ripple's delta-anchored scope by design.
  • Ripple only — fix-induced regressions that emerge from the interaction between changes, not from any single file. Review tools tend to miss these because they require tracing cause-and-effect across the diff.

Strongest when combined: Review catches what's wrong with your change. Ripple catches what your change did to everything else. Running only one leaves blind spots.

Usage Tips

PR SizeRecommendation
Small (1-5 files)/speckit.ripple.scan — full scan
Medium (6-15 files)/speckit.ripple.scan — full scan, consider critical filter if findings are noisy
Large (16+ files)/speckit.ripple.scan critical — start with critical only, then expand if needed
Re-scan after fixes/speckit.ripple.scan --diff — incremental scan on changed files only

Ripple reads the full diff plus blast radius files. Larger change sets consume more context. Use filters to keep scans focused.

Troubleshooting

ErrorSolution
"Run /speckit.tasks first"Generate tasks before running scan
"Run /speckit.ripple.scan first"Scan must run before resolve or check
No findings generatedVerify implemented code exists on disk and git has commits ahead of merge-base
Command not availableCheck specify extension list, restart agent session, reinstall

Requirements

  • Spec Kit >= 0.2.0
  • Existing spec artifacts (spec.md, plan.md, tasks.md)
  • Implemented code on disk

License

MIT — see LICENSE

Support


Extension Version: 1.0.0 | Spec Kit: >=0.2.0

Stats

3 stars

Version

1.0.0
Updated about 1 month ago

Install

Using the Specify CLI

specify extension add ripple --from https://github.com/chordpli/spec-kit-ripple/archive/refs/tags/v1.0.0.zip

Owners

License

MIT