Get the ultimate guide to shifting left with data contracts — O'Reilly Book
Get the ultimate guide to shifting left with data contracts — O'Reilly Book

Know who you will break before you hit merge.

Implement contracts for data objects in your code.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form. Please try again.

Gable Understands Your Code

II
// ===== UserProfileService.java =====
package demo;
public class UserProfileService {
  public User getUserProfile(String id) {
    User u = repository.findById(id);
    if (u == null) throw new NotFound("user");
    cacheInRedis(u);
    return u;
  }
  public void updateUserProfile(User u){
    repository.save(u);
    archiveToS3(u);
    indexInElasticsearch(u);
  }
  private void archiveToS3(User u){ /* s3://profiles/{id}.json */ }
  private void cacheInRedis(User u){ /* redis.set("user:"+u.id, json(u)) */ }
  private void indexInElasticsearch(User u){ /* es.index("users", u.id, u) */ }
}

// ===== EventProcessorService.java =====
package demo;
public class EventProcessorService {
  public void processUserEvent(Event e){
    insertUserEventToDb(e);
    archiveEventToS3(e);
  }
  private void insertUserEventToDb(Event e){ /* INSERT INTO user_events ... */ }
  private void archiveEventToS3(Event e){ /* s3://events/{id}.json */ }
}

// ===== FileImportService.java =====
package demo;
public class FileImportService {
  public void processBulkImport(File f){
    List rows = parse(f);
    insertImportRecordsToDb(rows);
    indexImportForSearch(rows);
  }
  public void processDataImportFromUrl(String url){ /* fetch+parse */ }
  private void insertImportRecordsToDb(List rows){ /* batch insert */ }
  private void indexImportForSearch(List rows){ /* es.bulk */ }
}
// ===== UserProfileService.java =====
package demo;
public class UserProfileService {
  public User getUserProfile(String id) { /* ... */ }
  public void updateUserProfile(User u){ /* ... */ }
  private void archiveToS3(User u){ /* ... */ }
  private void cacheInRedis(User u){ /* ... */ }
  private void indexInElasticsearch(User u){ /* ... */ }
}

// ===== EventProcessorService.java =====
package demo;
public class EventProcessorService { /* ... */ }

// ===== FileImportService.java =====
package demo;
public class FileImportService { /* ... */ }

Shift-left data object contracts in your code

Block risky changes at PR time, see who’s affected, and roll out safely

SCAN

Too many versions of the same object

Similar events/responses drift under different names and shapes. Teams pick the wrong one, duplicate work, and carry rework.

INSIGHTS

PRs lack impact context

Reviews miss breaking diffs. You can’t see which services, jobs, or pipelines will fail when a field changes or disappears.

CONTROL

Unknown owners and unclear communication

Who owns this code? Who made this change? Who can approve a change?

Solutions

Define what objects you ship before you build

Output catalog

Auto-surface every event/response your services emit so teams can see the canonical objects.

Contracts in repo

Enforce rules for each output, including fields, requiredness, and versioning, so unsafe changes are caught early.

See blast-radius in the pull request

PR Impact Map

Lists affected services, models, and jobs with the reason.

Suggested Reviewers

Auto-identify owners who should sign off.

Ship safely with clear guidance

Safe-Change Hints

Recommendations to version or scope changes to reduce impact.

Optional Merge Block

Hold merges until risk is addressed.

“I believe that Gable is the first next generation data management platform built for the AI era. It’s game changing for any company that truly values data and in this punch card generation of AI, I believe this is foundational.”

Kelvin Lim

Chief Technology Officer at x15ventures

“After putting Gable in production, we've had 0 data-related incidents.”

Zakariah Siyaji

Engineering Manager, Data Platform

Features

Contracts in Repo

Define object contracts alongside the service that emits them. Specify fields, requiredness, and semantics; generate docs for consumers; and enforce changes in CI so drift is caught before it ships.

PR Impact Map

Inline notes list the services, jobs, and pipelines affected by your change with the exact rule violated. You get a clear pre-merge view of blast radius and what to fix before you hit merge.

Suggested Reviewers

Automatically proposes the owners of the impacted code to request review from. Cuts ping-pong and shortens approval time.

Safe-Change Hints

Guidance to version, gate, or scope your change to contain risk. Suggestions are informed by patterns from similar merges that landed safely.

Read our featured Articles