A release report can join services to check results, count failures, and keep only services that need attention.

Program

Play the script to choose the maximum allowed failures and inspect the release readiness report.

max_failures
release_readiness_report.sql
Replay: real traced execution (multi-file project)
CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);
INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');
CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);
INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');
WITH params(max_failures) AS (VALUES (0)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);
INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');
CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);
INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');
WITH params(max_failures) AS (VALUES (1)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
  1. tables ← 1 row

    1CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');
    values this step1 rowtables
  2. services ← 3 rows

    1CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);
    values this step3 rowsservices
  3. tables ← 2 rows

    2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');
    values this step2 rowstables
  4. checks ← 6 rows

    3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');5WITH params(max_failures) AS (VALUES (0)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
    values this step6 rowschecks
  5. result ← 3 rows

    4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');5WITH params(max_failures) AS (VALUES (0)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
    values this step3 rowsresult
  1. tables ← 1 row

    1CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');
    values this step1 rowtables
  2. services ← 3 rows

    1CREATE TABLE services (id INTEGER, name TEXT, owner TEXT);2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);
    values this step3 rowsservices
  3. tables ← 2 rows

    2INSERT INTO services VALUES (1, 'api', 'platform'), (2, 'web', 'frontend'), (3, 'billing', 'finance');3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');
    values this step2 rowstables
  4. checks ← 6 rows

    3CREATE TABLE checks (service_id INTEGER, check_name TEXT, status TEXT);4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');5WITH params(max_failures) AS (VALUES (1)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
    values this step6 rowschecks
  5. result ← 3 rows

    4INSERT INTO checks VALUES (1, 'smoke', 'pass'), (1, 'schema', 'fail'), (2, 'smoke', 'pass'), (2, 'cdn', 'pass'), (3, 'smoke', 'fail'), (3, 'ledger', 'fail');5WITH params(max_failures) AS (VALUES (1)), service_failures AS (SELECT services.name, services.owner, SUM(CASE WHEN checks.status = 'fail' THEN 1 ELSE 0 END) AS failure_count FROM services JOIN checks ON checks.service_id = services.id GROUP BY services.name, services.owner) SELECT name, owner, failure_count, CASE WHEN failure_count <= (SELECT max_failures FROM params) THEN 'ready' ELSE 'blocked' END AS release_status FROM service_failures ORDER BY release_status DESC, name;
    values this step3 rowsresult
failure count The aggregate counts failed checks for each service.
release status The CASE expression labels each service as ready or blocked.
selector threshold `max_failures` changes the release policy without changing the report shape.