Untitled

Same tools. Same content. Different decisions. Each principle below appears twice — once wrong, once right. The difference is never the tooling. It's the judgment applied before the first parameter is set.

PRINCIPLE 1 — COLOR DISCIPLINE

The terms below — scheme, palette, semantic role — are defined in the chromatic language. One scheme per section. Max two schemes per page. Semantic roles (danger, success) are free — they carry meaning, not decoration. When every card has a hand-picked color, the reader sees variety and wonders what it means. It means nothing.

Anti-pattern: Rainbow Circus — Four cards about billing processes. Each gets a hand-picked color. The palette is technically valid but communicates nothing. The reader's eye bounces between hues looking for a pattern that isn't there.

Subscription Commerce

Plan selection, checkout, provisioning.

Entitlement Sync

Feature flags, access control.

Usage Metering

Consumption tracking, aggregation.

Invoice Generation

Billing runs, PDF rendering.

Correct: Scheme Auto-Assign — Same four cards. One scheme parameter. The palette is harmonious because it was designed to be. The reader sees a cohesive group — four parts of one system, not four unrelated items.

Subscription Commerce

Plan selection, checkout, provisioning.

Entitlement Sync

Feature flags, access control.

Usage Metering

Consumption tracking, aggregation.

Invoice Generation

Billing runs, PDF rendering.

PRINCIPLE 2 · HIERARCHY

Visual weight signals importance. If everything is the same size, nothing is primary. The reader's eye has no entry point — it scans randomly and gives up.

Anti-pattern: Democracy — Four equal columns. The happy path (94% of traffic) gets the same visual weight as monitoring (background noise). The reader must scan all four to find what matters.

Happy Path

Customer selects plan → checkout → provisioned. 94% of all subscriptions.

Upgrade / Downgrade

Mid-cycle plan change. Prorated credit, new entitlements sync.

Payment Failure

Card declined → dunning cycle. 3 retries over 14 days.

Monitoring

Health dashboard. Latency p99, error rates, queue depth.

Correct: Weight Matches Importance — The happy path gets half the row because it is the dominant case. Edge cases share the remainder. The reader's eye goes where it should — to the thing that matters most.

Happy Path

Customer selects plan → checkout → provisioned. This is 94% of all subscriptions. Everything else on this page is an exception to this flow.

Upgrade / Downgrade

Mid-cycle plan change with prorated credit.

Payment Failure

Card declined → dunning (3 retries, 14 days).

PRINCIPLE 3 · RESTRAINT

Every element must earn its place. The test: remove it. Does the reader lose anything? If two elements say the same thing, one is noise. Three is contempt for the reader's time.

Anti-pattern: Belt and Suspenders — An info box states the lifecycle. A flow chain shows the lifecycle. Cards describe the lifecycle. The reader sees the same four words in three formats and wonders which one to trust.

Create Provision Activate Bill
Create

Customer initiates a subscription through checkout.

Provision

Entitlements sync to the zone.

Activate

Service begins. Metering starts.

Bill

Invoice generated at cycle end.

Correct: Each Element Does One Job — The flow chain carries the summary (sequence and direction). The cards carry the depth (what actually happens at each stage). No info box restating what's already visible twice.

Create Provision Activate Bill
Create

Checkout validates payment, applies coupons, writes the subscription record. Provisioning begins asynchronously — the customer sees confirmation before entitlements exist.

Provision → Activate

Entitlement sync delivers feature flags to the zone. Activation is automatic on sync completion. Metering starts on activation, not on creation.

Bill

Billing run aggregates metered usage, applies rate cards, generates the invoice. Failed charges enter dunning — a separate lifecycle entirely.

PRINCIPLE 4 · CARD SUBSTANCE

Cards are for concepts that need visual separation and parallel comparison. If the content is a flat list of names, use a table. Cards promise depth — if they don't deliver, the format is lying.

Anti-pattern: Anemic Cards — Five cards, each with a title and two words. This is a table wearing a disguise. The visual weight is wrong — cards promise depth and deliver nothing. The reader processes five boxes to learn what a five-row table would convey in a glance.

Create

New subscription

Read

Get details

Update

Modify plan

Delete

Cancel subscription

List

Query subscriptions

Correct: Table for Reference, Cards for Concepts — The CRUD endpoints are reference data — they belong in a table. Cards are reserved for the architectural decisions that actually need visual weight and parallel comparison.

EndpointMethodDescriptionAuth
/subscriptionsPOSTCreate a new subscriptionBearer token
/subscriptions/:idGETRetrieve subscription detailsBearer token
/subscriptions/:idPATCHModify plan or quantityBearer token
/subscriptions/:idDELETECancel (soft delete)Bearer token
/subscriptionsGETList with filters and paginationBearer token
Why Soft Delete?

Subscriptions carry financial history — invoices, payments, credits. Hard delete would orphan those records. Soft delete preserves the audit trail while removing the subscription from active queries. Reactivation within 30 days restores the original subscription ID.

Why No PATCH on Collection?

Bulk plan changes require coordinated provisioning — each subscription's entitlements must sync independently. A collection PATCH would hide N async operations behind one synchronous response. Instead, clients issue individual PATCHes and track provisioning status per subscription.

PRINCIPLE 5 · FLOW SEMANTICS

Flow chains show temporal sequence — step A happens before step B. The arrows mean then. If the items aren't sequential, the arrows lie. A reader who trusts the arrows will build a wrong mental model.

Anti-pattern: Topology as Sequence — These are system components, not a process. The dashboard doesn't "lead to" the API. The worker doesn't "become" a database. The arrows imply temporal ordering that doesn't exist.

Dashboard API Worker Database Cache

Correct: Actual Temporal Sequence — Each step happens after the previous one. A reader can trace the flow left to right and understand the order of operations. The arrows earn their meaning.

Subscribe Provision Activate Meter Invoice
PRINCIPLE 6 · FORMAT FIT

Every format has a natural content type. Cards compare concepts side by side. Tables organize reference data. Flow chains show sequences. Mismatching format and content creates friction — the reader fights the layout to extract meaning.

Anti-pattern: Cards for Everything — Six API endpoints in six cards across two rows. No card has more content than its neighbor. No card needs visual separation from the others. This is a table forced into card format — all weight, no information density.

GET /zones

List all zones

POST /zones

Create a zone

GET /zones/:id

Zone details

PATCH /zones/:id

Update settings

DELETE /zones/:id

Delete a zone

GET /zones/:id/dns

List DNS records

Correct: Table for Reference, Cards for Decisions — The six endpoints go in a table where a reader can scan them in seconds. Cards are reserved for the two design decisions that actually benefit from visual weight and side-by-side comparison.

EndpointMethodDescriptionRate Limit
/zonesGETList all zones for the account1000 / 5min
/zonesPOSTCreate a new zone5 / min
/zones/:idGETGet zone details and settings1000 / 5min
/zones/:idPATCHUpdate zone settings200 / 5min
/zones/:idDELETEPermanently delete a zone5 / min
/zones/:id/dnsGETList DNS records for a zone1000 / 5min
Why Aggressive Rate Limits on Writes?

Zone creation triggers nameserver assignment — a globally distributed operation that takes 5-30 minutes to propagate. Allowing burst creation would queue thousands of NS assignments, degrading propagation time for everyone. The 5/min limit matches the operational reality.

Why No Bulk DELETE?

Zone deletion stops DNS resolution immediately. A bulk endpoint deleting 100 zones in one call would be indistinguishable from an account compromise. Single-zone deletion with rate limiting gives operators time to notice and intervene. The friction is the feature.

Every anti-pattern above was produced by the same tools that produce the correct versions. Tools don't prevent bad design — principles do. If you can't articulate why a card exists instead of a table row, the card shouldn't exist.