Skip to content
Back to skills

Horizontal Scalability Reviewer

ASecurity

Review whether a system can scale OUT (add nodes) rather than only up — a can-it-scale-horizontally lens: statelessness / session and in-memory-state externalization, connection pooling and connection-count ceilings, sticky-session and in-process-singleton / local-cache / local-cron / local-filesystem smells, autoscaling + load-balancer + health-check config, and graceful shutdown/draining so scale-in does not drop work. Produces a scale-out readiness verdict with component/file findings rank...

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 11, 2026
businessgonodegitdatabase

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned October 5, 2026

npx -y skills add ModernNomad-98/Project-Aegis --skill horizontal-scalability-reviewer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Horizontal Scalability Reviewer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Horizontal Scalability Reviewer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/modernnomad-98-horizontal-scalability-reviewer/badge)](https://www.skillsdirectory.com/skills/modernnomad-98-horizontal-scalability-reviewer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: horizontal-scalability-reviewer
description: 'Review whether a system can scale OUT (add nodes) rather than only up — a can-it-scale-horizontally lens: statelessness / session and in-memory-state externalization, connection pooling and connection-count ceilings, sticky-session and in-process-singleton / local-cache / local-cron / local-filesystem smells, autoscaling + load-balancer + health-check config, and graceful shutdown/draining so scale-in does not drop work. Produces a scale-out readiness verdict with component/file findings ranked by blast radius and a remediation order. Use when reviewing readiness to run multiple instances or autoscale, when adding a second node breaks things, or when "it works on one box" must become many. Do NOT use to SET reliability targets (slo-reliability-architect), allocate a LATENCY budget (latency-budget-architect), review failure containment, failover or disaster recovery (resilience-architecture-reviewer), or design the CACHE (caching-strategy-designer) — this reviews scale-out readiness and defers those.'
---

# Horizontal Scalability Reviewer

Terms: **DB** means database; **LB** means load balancer; **DoS** means
denial of service; **SLO** means service-level objective; **TTL** means
time to live; **N** denotes the number of running instances.

## Purpose

A system that runs fine on one box can fail the instant a second box joins
it: sessions live in local memory so half the requests log the user out,
a scheduled job fires on every node instead of once, a local write-through
cache goes stale per-node, an in-process counter under-counts, and a
scale-in drops the connections and jobs a draining node was holding. This
skill reviews a system for those failure modes BEFORE they become a 2 a.m.
incident: it hunts the state and singletons that assume one instance,
checks the connection-pool and load-balancer/health-check config, and
verifies graceful drain. The deliverable is a scale-out readiness verdict —
per-finding, with the file/component, the failure it causes when instances
multiply, blast radius, and a remediation order. It reviews readiness; it
does not set the targets, the latency budget, or design the cache those
findings may point to.

## Use When

- Use when: reviewing whether a service is ready to run as multiple
  instances or under an autoscaler — before turning on horizontal scaling.
- Use when: adding a second (or Nth) instance breaks something — users get
  logged out intermittently, a job runs N times, a cache is inconsistent
  across nodes, counts are wrong.
- Use when: "it works on one server" must become "it works on many," or a
  monolith/instance is being prepared to scale out.
- Use when: an autoscaling / load-balancer / graceful-drain configuration
  needs a scale-out-correctness review (not a cost review).
- Do NOT use when: the task is to SET reliability/availability targets or
  error budgets — that is `slo-reliability-architect`; this review may find
  scale-out gaps that threaten those targets, but it does not define them.
- Do NOT use when: the task is to allocate an end-to-end LATENCY budget
  across hops — that is `latency-budget-architect`.
- Do NOT use when: the question is what happens when a dependency, zone or
  region FAILS, or whether failover and disaster recovery work — that is
  `resilience-architecture-reviewer`; this review asks whether many
  instances run correctly, not how the system survives losing some.
- Do NOT use when: the task is to DESIGN caching (what to cache, TTLs,
  invalidation) — that is `caching-strategy-designer`; this review flags a
  node-LOCAL cache as a scale-out smell and hands the redesign over.
- Do NOT use when: the question is whether to shard the DATA layer for write
  throughput — that is data partitioning/sharding (a separate concern), not
  stateless-app scale-out.

## Inputs to Inspect

1. The deployment shape: how many instances run today, behind what load
   balancer, with what health check, and whether autoscaling is on or planned.
2. Session/auth handling: where session state lives (in-memory, sticky
   cookie, external store), and whether any request assumes it lands on the
   same node as a prior one.
3. In-process state: caches, counters, rate-limiter state, feature-flag
   caches, singletons, and anything held in a module-level variable across
   requests.
4. Scheduled work: cron/timers running inside the app process — do they fire
   once cluster-wide or once per node?
5. Connection management: DB/cache/queue connection pools, their per-instance
   size, and the total against the datastore's connection ceiling when
   instances multiply.
6. Local resources: filesystem writes, local temp files, uploads written to
   local disk, in-memory websockets/connections, and anything not shared
   across nodes.
7. Shutdown behavior: what happens to in-flight requests, jobs, and
   connections when a node is terminated (deploy, scale-in, spot reclaim).

## Workflow

1. **Establish the target topology.** N instances, autoscaled or fixed,
   behind which LB, with which health check. The review is against "many
   instances of this run concurrently and are added/removed at any time."
2. **Hunt state that assumes one instance.** For each of session/auth,
   caches, counters, rate-limiter state, and any module-level mutable state:
   does correctness depend on the same node serving related requests? Flag
   each with the concrete failure when it does not (logout, stale read,
   under-count, bypassed limit).
3. **Hunt singletons that must run once, not N times.** In-process cron,
   startup migrations, leader-only work, cache-warmers: on N nodes they run
   N times unless coordinated. Flag each and note the coordination need
   (external scheduler, leader election, advisory lock).
4. **Check sticky-session reliance.** Sticky sessions can paper over local
   state — but a node death loses that state and pins load unevenly. Flag
   stickiness used as a correctness crutch (vs a legitimate connection
   affinity) and point at session externalization.
5. **Check connection ceilings.** Per-instance pool size × max instances vs
   the datastore/cache/queue connection limit. Autoscaling that multiplies
   connection pools can exhaust the database's connection cap and take the
   whole fleet down — flag the ceiling and recommend a pooler/proxy if the
   math breaks.
6. **Check local-resource assumptions.** Filesystem writes, local upload
   staging, local temp that a later request on another node expects to find:
   flag as needing shared storage (hand file/upload redesign to
   `file-upload-storage-architect`).
7. **Check graceful drain.** On termination: does the node deregister from
   the LB, stop taking new work, finish or safely hand off in-flight
   requests/jobs/connections, within a bounded grace period? A missing drain
   drops user requests and in-flight jobs on every deploy. Verify readiness/
   readiness stops new traffic while liveness remains healthy through the
   bounded drain, until controlled shutdown. Check the actual probe and
   termination behavior.
8. **Rank findings by blast radius and deliver the verdict.** Each finding:
   component/file, the scale-out failure it causes, blast radius (silent
   data wrongness > dropped work > uneven load), and remediation. Defer:
   targets → `slo-reliability-architect`; latency → `latency-budget-architect`;
   cache design → `caching-strategy-designer`.

## Output Format

```
HORIZONTAL SCALABILITY REVIEW — <service/system>
Target topology: <N instances, autoscale y/n, LB, health check>
Verdict: <READY | READY-WITH-FIXES | NOT-READY> for scale-out
Findings (ranked by blast radius):
  [BLOCKER|HIGH|MED|LOW] <component/file:line> — <state/singleton/pool/local/drain>
    scale-out failure: <what breaks when instances multiply / churn>
    remediation: <externalize / coordinate-once / pool-proxy / shared-store / drain>
Connection ceiling: <pool × instances vs datastore cap — OK | AT RISK>
Graceful drain: <present/absent; deregister → stop-new → finish/handoff → grace>
Deferrals: targets → slo-reliability-architect; latency → latency-budget-architect;
  cache design → caching-strategy-designer; file storage → file-upload-storage-architect
Open questions / risks: <each with risk-if-wrong / who answers>
```

## Validation Checklist

- [ ] Session/auth state is externalized or the review flags where it is not,
      with the concrete failure (intermittent logout) named.
- [ ] Every in-process cache/counter/limiter/singleton is checked for
      single-instance assumptions; scheduled work is checked for run-once-vs-
      run-N-times.
- [ ] Sticky-session reliance is distinguished from legitimate affinity and
      flagged where it is a correctness crutch.
- [ ] Connection-ceiling math (pool × max instances vs datastore cap) is
      done, not assumed; a breaking ceiling is a BLOCKER.
- [ ] Local-filesystem / local-upload assumptions are flagged for shared
      storage.
- [ ] Graceful drain is verified: deregister, stop-new, finish/handoff,
      bounded grace, and correct readiness/liveness semantics.
- [ ] Findings are ranked by blast radius, with silent data-wrongness above
      dropped-work above uneven-load.
- [ ] Targets, latency budgets, and cache design are deferred to their owning
      skills, not invented here.

## Gotchas

- The most dangerous scale-out bug is silent, not loud: an under-counting
  in-memory rate limiter or a per-node stale cache produces WRONG answers,
  not errors — no alarm fires while the data quietly rots.
- In-process cron on an autoscaled fleet fires the "nightly" job once per
  node per night; on 8 nodes that is 8 charges / 8 emails / 8 rollups.
- Sticky sessions are not high availability: they pin a user to a node, and
  when that node dies the user's session dies with it. Stickiness hides the
  state problem until the worst moment.
- Autoscaling can DOS your own database: each new app instance opens a pool,
  and at max scale the pools exceed the DB's connection limit — the fleet
  scales up and the database falls over.
- A local write-through cache is correct on one node and inconsistent on
  many; node A updates its cache and node B keeps serving the old value.
- No graceful drain means every deploy is a mini-outage: in-flight requests
  and jobs on the terminated node are dropped. Zero-downtime deploy is a
  drain property, not a wish.
- "We'll just use sticky sessions / one big box" is vertical scaling wearing
  a horizontal costume — say so, and point at the state that must move.

## Stop Conditions

- The intended target topology (how many instances, autoscaled or not, what
  LB) is unknown → obtain it before reviewing; "ready to scale out" is
  meaningless without the topology it must be ready for.
- A finding's fix requires SETTING an availability/error-budget target to
  decide acceptable drop/degradation → hand the target decision to
  `slo-reliability-architect`; do not invent the SLO to justify the fix.
- The real problem is write-throughput at the data layer (needs
  partitioning/sharding), not stateless-app scale-out → say so and route to
  the data-partitioning concern; this review does not shard databases.
- Asked to APPLY the fixes to a live system (change LB/autoscaler config,
  externalize sessions in production) → this skill REVIEWS and recommends;
  executing infra changes follows the repo's approval path.

## Supporting Files

- `evals/evals.json` — behavior cases: the pre-scale-out readiness review,
  the in-memory-singleton / run-N-times edge, the connection-ceiling catch,
  and the SLO-setting non-trigger.
- `evals/trigger-evals.json` — discrimination against
  `slo-reliability-architect` (targets), `latency-budget-architect` (latency
  allocation), and `caching-strategy-designer` (cache design).
- No `references/` — the state/singleton/pool/drain checklist above is the
  complete review procedure; findings live in the produced verdict.

Files in this skill

  • SKILL.md11.1 KB
  • evals/evals.json4.6 KB
  • evals/trigger-evals.json4.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.