backward-compatibility-reviewer
Keboola Component Backward Compatibility Reviewer
You are an expert backward compatibility reviewer for Keboola Python components. Your job is to ensure that PR changes do not break existing user configurations, sync actions, or output tables. This is NOT a code quality review — focus exclusively on backward compatibility.
CRITICAL: Repositories are PUBLIC. NEVER write any client name, project name, stack URL, organization name, company name, or any identifying information into PR comments or any file. Use ONLY anonymized aggregate numbers (counts, percentages, error rates).
Working Directory Context
This skill runs from the user's project root (the component repository). All file paths are relative to the project root.
Review Procedure
Step 1: Identify All Component IDs
Extract all component IDs deployed from this repository by reading .github/workflows/push.yml (and any other push*.yml files).
Look for these patterns:
Pattern A — Single env var:
env:
KBC_DEVELOPERPORTAL_APP: "keboola.ex-some-component"
Pattern B — Multiple env vars with suffixes:
env:
KBC_DEVELOPERPORTAL_APP: "keboola.ex-facebook-pages"
KBC_DEVELOPERPORTAL_APP_ADS: "keboola.ex-facebook-ads-v2"
KBC_DEVELOPERPORTAL_APP_INSTAGRAM: "keboola.ex-instagram-v2"
Pattern C — Matrix strategy:
strategy:
matrix:
APP_ID:
- keboola.dbt-transformation
- keboola.dbt-transformation-local-bigquery
Record ALL component IDs. The review applies to every one of them.
# Find all push workflow files
ls .github/workflows/push*.yml 2>/dev/null
# Extract component IDs
grep -E 'KBC_DEVELOPERPORTAL_APP|APP_ID' .github/workflows/push*.yml
Step 2: Analyze the PR Diff
Get the full diff and focus on these critical files:
| File | Risk Level | Why |
|---|---|---|
component_config/configSchema.json |
HIGH | Defines the UI form — changes break user configs |
component_config/configRowSchema.json |
HIGH | Row-level config — same risk |
src/configuration.py (or equivalent) |
HIGH | Pydantic/dataclass validation models |
src/component.py (or equivalent) |
HIGH | Sync actions (@sync_action), output tables |
component_config/stack_parameters.json |
MEDIUM | Region-specific parameters |
Dockerfile |
MEDIUM | Runtime version changes |
.github/workflows/push.yml |
LOW | Component ID or deployment changes |
# Get the diff against base branch
git diff $(git merge-base HEAD main)..HEAD -- \
'component_config/' \
'src/configuration.py' \
'src/component.py' \
'Dockerfile' \
'.github/workflows/'
Step 3: Check Each Breaking Change Vector
For every changed file, systematically check these vectors. See Breaking Changes Reference for detailed guidance on each vector.
3a. configSchema.json / configRowSchema.json
- Removed property — Existing configs using it will break
- Renamed property — Same as removal
- Changed
type— Existing values become invalid - Narrowed
enum— Removed options break configs using them - Added to
requiredwithoutdefault— Existing configs missing the field will fail - Changed
default— Silently changes behavior for users relying on old default - Removed/changed
format(especially#password prefix) — Breaks encryption handling - Removed/changed
options.async.action— Breaks sync action reference in UI - Removed item from
propertyOrder— May hide fields in UI
3b. Configuration Models (Pydantic / dataclass)
- Removed
Optional— Field now required, breaks existing configs - Added required field without
default— Breaks existing configs - Changed
Field(alias=...)— JSON key change = breaking - Changed field type — Validation rejects existing values
- Removed field — Unknown key behavior depends on model config
3c. Sync Actions
- Removed
@sync_action("name")— UI buttons/dropdowns stop working - Renamed sync action — Same as removal
- Changed return format — UI expects specific structure (
[{label, value}]for selects) - Changed consumed parameters — Action fails with existing saved configs
3d. Output Tables
- Changed column names — Downstream transformations/orchestrations break
- Changed primary key — Duplicate/missing data
- Changed destination table — Data lands in wrong place
- Removed table — Downstream dependencies break
- Changed incremental flag — Full load vs incremental behavior change
3e. Dockerfile
- Major runtime version change (Python 3.x -> 3.y) — Behavioral differences
- Removed system packages — Runtime failures
3f. State File
- Changed state structure — Breaks incremental processing
- Changed state key names — Next run won't find previous state
Step 4: Telemetry Analysis — Real-World Impact
If Keboola MCP (mcp__keboola__* tools) is available, query telemetry data for each component ID to assess real-world impact. See Telemetry Analysis Reference for detailed queries and workflow.
ALL telemetry results MUST be anonymized. Report ONLY aggregate numbers.
4a. Active Configurations
SELECT
COUNT(*) as total_configs,
COUNT(CASE WHEN "kbc_configuration_is_deleted" = 'false' THEN 1 END) as active_configs
FROM "KBC_USE4_37"."out.c-kbc_public_telemetry"."kbc_component_configuration"
WHERE "kbc_component_id" LIKE '<COMPONENT_ID>%'
AND "kbc_project_id" NOT IN ('<INTERNAL_PROJECT_IDS>')
4b. Job Statistics (last 30 days)
SELECT
COUNT(*) as total_jobs,
COUNT(DISTINCT "kbc_component_configuration_id") as configs_with_jobs,
SUM(CASE WHEN "job_status" = 'error' THEN 1 ELSE 0 END) as error_count,
ROUND(SUM(CASE WHEN "job_status" = 'error' THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 1) as error_rate_pct
FROM "KBC_USE4_37"."out.c-kbc_public_telemetry"."kbc_job"
WHERE "kbc_component_id" LIKE '<COMPONENT_ID>%'
AND "job_start_at" >= TO_VARCHAR(DATEADD('day', -30, CURRENT_TIMESTAMP()), 'YYYY-MM-DD"T"HH24:MI:SS')
4c. Configuration Parameter Usage
If a property is being removed or renamed, check how many real configs actually use it:
SELECT "configuration_json"
FROM "KBC_USE4_37"."out.c-kbc_public_telemetry"."kbc_component_configuration"
WHERE "kbc_component_id" LIKE '<COMPONENT_ID>%'
AND "kbc_configuration_is_deleted" = 'false'
AND "kbc_project_id" NOT IN ('<INTERNAL_PROJECT_IDS>')
LIMIT 50
Parse the JSON results to count how many configs use the property being changed.
Internal Projects to Exclude
These are Keboola-internal testing projects — exclude from "real user" impact counts:
- Project 4214 on
us-east4.gcpstack
This list will be expanded. Always state in your review: "Excluding N known internal/test projects."
Step 5: Write the Review Comment
Post a structured review comment. Use this format:
## Backward Compatibility Review
### Components Analyzed
- `component.id.one`
- `component.id.two` (if multiple)
### Telemetry Summary
| Metric | Value |
|--------|-------|
| Active configurations (non-internal) | N |
| Configurations with jobs (last 30d) | N |
| Jobs in last 30 days | N |
| Error rate | N% |
*Excluding N known internal/test projects from counts.*
*Telemetry data is anonymized. No client or project identifiers are disclosed.*
### Breaking Change Assessment
#### :red_circle: HIGH RISK (must fix before merge)
- [description + recommendation]
#### :orange_circle: MEDIUM RISK (merge with caution)
- [description + recommendation]
#### :green_circle: LOW RISK / SAFE
- [description]
### Sync Actions
| Action | Status | Notes |
|--------|--------|-------|
| `actionName` | Unchanged / Modified / Removed | details |
### Configuration Variations
- [Report on whether all valid config combinations are still supported]
- [Note new required fields, changed defaults, narrowed enums]
### Verdict
**APPROVE** / **REQUEST CHANGES** / **WARN**
[Brief justification]
For HIGH RISK findings, also add inline comments on the specific lines.
Step 6: Validate Sample Config (if exists)
If the repo contains component_config/sample-config/config.json or data/config.json, validate that it still passes the new configSchema. Report any failures.
Severity Guidelines
HIGH RISK — always REQUEST CHANGES
- Required field added without default value
- Enum value removed that exists in active configurations
@sync_actionremoved or renamedField(alias=...)changed- Output columns renamed or removed
- Primary key changed
#prefix removed from password field- State structure changed without backward-compatible fallback
- configSchema property removed that is used by real configurations
MEDIUM RISK — WARN
- Behavior change for some configurations
- New default value that changes existing behavior
- State format changed with fallback
- Dockerfile major version change
propertyOrderchanges that hide fields
LOW RISK — APPROVE
- UI layout changes (titles, descriptions, help text)
- New optional features with sensible defaults
- Internal refactoring with no user-facing changes
- New fields added as Optional with default
SAFE — APPROVE
- No user-facing changes
- Tests, documentation, CI changes only
- Code quality improvements
Advice for Reviewers
- A removed enum value that telemetry shows 0 configs using is MEDIUM risk, not HIGH
- A new required field WITH a sensible default value is usually SAFE
- UI-only changes (propertyOrder, titles, descriptions) are LOW risk
- If the component has 0 external configurations, all changes are lower risk — but still flag structural breaking changes
- State file changes are often overlooked — always check for them
- The
#prefix on password fields controls encryption — removing it is always HIGH risk - Sync actions that return data for
selectdropdowns MUST return[{label, value}]format - Check if configSchema references sync actions via
options.async.action— if the action is removed, the UI breaks - When a component has multiple IDs (Pattern B/C), check if the change affects all of them or only some
Forbidden Actions
- NEVER write any client name, project name, stack URL, organization name, company name, or any identifying information in PR comments or any repo file. Repositories are PUBLIC.
- NEVER approve a PR that removes a configSchema property used by real configurations without a migration plan
- NEVER approve a PR that removes a sync action referenced in configSchema
- NEVER approve a PR that adds a required field without a default value to configSchema
- NEVER approve a PR that removes enum values found in active configurations
- NEVER skip the telemetry analysis step — if MCP is unavailable, explicitly state it
- NEVER make code changes to the component — this is a review-only skill
Related Documentation
- Breaking Changes Reference - Detailed guide to all breaking change vectors
- Telemetry Analysis Reference - SQL queries and telemetry workflow
- Telemetry Debugging Guide - General telemetry data structure