mcpField
D
db-replicas-views

db-replicas-views

github.com/hainrixzData & databases2169 installsUpdated 3d ago
Repository

About db-replicas-views

db-replicas-views is a database-audit skill for spotting correctness and performance risks from read replicas and materialized views. It combines static code and DDL checks with optional Postgres verification, while distinguishing measured evidence from likely concerns.

Key features

  1. 01Detect read-after-write replica routing
  2. 02Inspect materialized-view refresh patterns
  3. 03Flag blocking refresh commands
  4. 04Verify replica lag and view state
  5. 05Separate measured facts from inferred risks

Use cases

  1. 01Check whether a newly written comment may be absent on the next page load
  2. 02Review a materialized view with no visible refresh schedule
  3. 03Assess whether a refresh command blocks readers

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/hainrixz/claude-db --skill db-replicas-views

After installing, type/db-replicas-viewsin Claude Code to confirm it loaded.

Details

From the project README

db-replicas-views (M17)

Read replicas and materialized views scale reads, but both introduce staleness that silently breaks correctness if the application assumes fresh data. This is a Performance & Scale (axis performance) concern; feeds relational Escala w12 (shared with M16/M2/M9).

What it checks

  1. Read-your-writes — a write immediately followed by a read of the same data, where the read may be routed to an async replica that has not yet caught up. User writes a comment, the next page load reads the replica and the comment is "gone." Recommend routing the immediate read to the primary, or using sync/quorum reads where required.
  2. Materialized-view refresh — an MATERIALIZED VIEW queried as if live but refreshed manually / on a slow cron / never, so it serves stale data. Flag REFRESH MATERIALIZED VIEW without CONCURRENTLY (locks readers), and views with no visible refresh schedule.

Score / axis

Feeds performance only (relational Escala w12; replica/view concerns map to the Query/Escala categories in NoSQL profiles where applicable).

Tier-0 (static)

Detect replica routing config (read/write split in the ORM/driver, multiple connection URLs), write→ read sequences against the same entity, CREATE MATERIALIZED VIEW DDL, and any REFRESH calls (and whether CONCURRENTLY). Actual replication lag and refresh recency are runtime → needs_api at Tier-0 (never a silent pass).

Tier-1/2 (verification query, Postgres)

-- replication lag (Tier-1, on primary):
SELECT client_addr, state,
       pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag_bytes
FROM pg_stat_replication;
-- matview presence + populated state:
SELECT matviewname, ispopulated FROM pg_matviews;

Method query_stat / schema_introspect. Measurable replay_lag_bytes confirms the read-your-writes exposure as established; matview refresh recency needs the app's schedule or Tier-2 observation — absent it, staleness is directional.

Findings

Emit findings per schema/finding.schema.json. Examples:

  • M17.comments.read_your_writes_on_replica — immediate read after write routed to a replica (severity:3, warn, axis performance, confidence directional static / established Tier-1, fixable: proposed — route the read to primary).
  • M17.dashboard.matview_no_refresh — materialized view with no visible refresh schedule (severity:2, warn, directional / needs_api, fixable: advisory).
  • M17.dashboard.refresh_blocks_readers — REFRESH MATERIALIZED VIEW without CONCURRENTLY (severity:2, warn, established from DDL, fixable: proposed).

Each finding: evidence.observed quotes the routing config / view DDL / catalog row verbatim; verification.reproduce is the query above referencing $DATABASE_URL; expected_impact is banded + confidence-tagged (no naked %).

Honesty

  • Replica staleness is correct by design for most analytics/reporting reads — flag it only where the read path needs its own just-written data, not as a blanket "replicas are dangerous."
  • Never quote a lag number or a stale-read probability you cannot measure; lag claims need Tier-1 to be established, otherwise directional.
  • REFRESH … CONCURRENTLY requires a unique index on the matview — note that prerequisite in the fix preview. Routing/refresh changes are proposed/advisory, never auto.

Comments

Markdown supported