From bdfceba78830fcdefbbfa83d00729c580a5f0309 Mon Sep 17 00:00:00 2001 From: PatternCatalyst Date: Fri, 23 Oct 2026 07:30:20 -0400 Subject: [PATCH] docs(diagrams): Geewax voice pass on diagram labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rule 12 (em dash, zero tolerance) applied to the 118 figures that carried one: - Recast every em-dash label in assets/diagrams/*.svg and the matching — in the paired *.excalidraw (text + originalText), keeping each pair in sync. Apposition labels take a colon; clause joins take a comma or period; a few long labels that already held a colon were reworded to avoid a double colon. - Recast the same labels in the diagram generator sources (gen_*.py, generate_example_diagrams.py) so a regenerate stays clean. No diagrams removed; only label punctuation changed. Excalidraw JSON still valid; validate_site.py clean; sample renders checked for overflow. --- .../diagrams/00-patterns-literacy.excalidraw | 4 ++-- assets/diagrams/00-patterns-literacy.svg | 2 +- assets/diagrams/01-factors-mapped.excalidraw | 4 ++-- assets/diagrams/01-factors-mapped.svg | 2 +- assets/diagrams/01-six-pillars.excalidraw | 4 ++-- assets/diagrams/01-six-pillars.svg | 2 +- assets/diagrams/01-twelve-factors.excalidraw | 4 ++-- assets/diagrams/01-twelve-factors.svg | 2 +- assets/diagrams/02-pick-protocol.excalidraw | 4 ++-- assets/diagrams/02-pick-protocol.svg | 2 +- assets/diagrams/02-sync-vs-async.excalidraw | 8 ++++---- assets/diagrams/02-sync-vs-async.svg | 4 ++-- assets/diagrams/03-composition.excalidraw | 4 ++-- assets/diagrams/03-composition.svg | 2 +- assets/diagrams/03-three-ways.excalidraw | 4 ++-- assets/diagrams/03-three-ways.svg | 2 +- assets/diagrams/04-cqrs.excalidraw | 4 ++-- assets/diagrams/04-cqrs.svg | 2 +- assets/diagrams/04-db-per-service.excalidraw | 8 ++++---- assets/diagrams/04-db-per-service.svg | 4 ++-- assets/diagrams/04-saga.excalidraw | 8 ++++---- assets/diagrams/04-saga.svg | 4 ++-- .../diagrams/05-amqp-architecture.excalidraw | 4 ++-- assets/diagrams/05-amqp-architecture.svg | 2 +- .../05-checkpoint-recovery.excalidraw | 4 ++-- assets/diagrams/05-checkpoint-recovery.svg | 2 +- .../05-choreography-orchestration.excalidraw | 8 ++++---- .../05-choreography-orchestration.svg | 4 ++-- .../05-ecst-vs-notification.excalidraw | 12 +++++------ assets/diagrams/05-ecst-vs-notification.svg | 6 +++--- assets/diagrams/05-event-backbone.excalidraw | 4 ++-- assets/diagrams/05-event-backbone.svg | 2 +- .../05-event-time-watermark.excalidraw | 4 ++-- assets/diagrams/05-event-time-watermark.svg | 2 +- assets/diagrams/05-eventification.excalidraw | 4 ++-- assets/diagrams/05-eventification.svg | 2 +- .../diagrams/05-kafka-architecture.excalidraw | 8 ++++---- assets/diagrams/05-kafka-architecture.svg | 4 ++-- assets/diagrams/05-log-truth.excalidraw | 4 ++-- assets/diagrams/05-log-truth.svg | 2 +- .../05-pulsar-architecture.excalidraw | 4 ++-- assets/diagrams/05-pulsar-architecture.svg | 2 +- .../diagrams/05-saga-compensation.excalidraw | 4 ++-- assets/diagrams/05-saga-compensation.svg | 2 +- assets/diagrams/05-sidecar.excalidraw | 12 +++++------ assets/diagrams/05-sidecar.svg | 6 +++--- .../05-sourcing-vs-streaming.excalidraw | 12 +++++------ assets/diagrams/05-sourcing-vs-streaming.svg | 6 +++--- .../05-state-store-changelog.excalidraw | 4 ++-- assets/diagrams/05-state-store-changelog.svg | 2 +- assets/diagrams/05-tools-landscape.excalidraw | 12 +++++------ assets/diagrams/05-tools-landscape.svg | 6 +++--- assets/diagrams/06-derive-streams.excalidraw | 4 ++-- assets/diagrams/06-derive-streams.svg | 2 +- assets/diagrams/06-scale-on-lag.excalidraw | 4 ++-- assets/diagrams/06-scale-on-lag.svg | 2 +- assets/diagrams/06-window-types.excalidraw | 12 +++++------ assets/diagrams/06-window-types.svg | 6 +++--- assets/diagrams/07-jobs-cronjobs.excalidraw | 4 ++-- assets/diagrams/07-jobs-cronjobs.svg | 2 +- ...7-orchestration-vs-choreography.excalidraw | 8 ++++---- .../07-orchestration-vs-choreography.svg | 4 ++-- .../diagrams/08-contract-lifecycle.excalidraw | 4 ++-- assets/diagrams/08-contract-lifecycle.svg | 2 +- assets/diagrams/08-four-planes.excalidraw | 4 ++-- assets/diagrams/08-four-planes.svg | 2 +- assets/diagrams/10-catalog-payoffs.excalidraw | 4 ++-- assets/diagrams/10-catalog-payoffs.svg | 2 +- .../diagrams/10-metadata-catalog.excalidraw | 20 +++++++++---------- assets/diagrams/10-metadata-catalog.svg | 10 +++++----- assets/diagrams/11-sampling.excalidraw | 12 +++++------ assets/diagrams/11-sampling.svg | 6 +++--- .../diagrams/11-signals-in-depth.excalidraw | 4 ++-- assets/diagrams/11-signals-in-depth.svg | 2 +- assets/diagrams/11-three-signals.excalidraw | 4 ++-- assets/diagrams/11-three-signals.svg | 2 +- .../diagrams/11-trace-propagation.excalidraw | 8 ++++---- assets/diagrams/11-trace-propagation.svg | 4 ++-- assets/diagrams/11-trace-stitch.excalidraw | 4 ++-- assets/diagrams/11-trace-stitch.svg | 2 +- assets/diagrams/12-bulkhead.excalidraw | 4 ++-- assets/diagrams/12-bulkhead.svg | 2 +- assets/diagrams/12-claim-check.excalidraw | 4 ++-- assets/diagrams/12-claim-check.svg | 2 +- assets/diagrams/12-four-cs.excalidraw | 8 ++++---- assets/diagrams/12-four-cs.svg | 4 ++-- assets/diagrams/12-policy-as-code.excalidraw | 4 ++-- assets/diagrams/12-policy-as-code.svg | 2 +- assets/diagrams/12-sidecar.excalidraw | 4 ++-- assets/diagrams/12-sidecar.svg | 2 +- assets/diagrams/12-valet-key.excalidraw | 8 ++++---- assets/diagrams/12-valet-key.svg | 4 ++-- assets/diagrams/12-zero-trust.excalidraw | 4 ++-- assets/diagrams/12-zero-trust.svg | 2 +- .../13-antipattern-heuristics.excalidraw | 16 +++++++-------- assets/diagrams/13-antipattern-heuristics.svg | 8 ++++---- .../diagrams/13-antipatterns-grid.excalidraw | 8 ++++---- assets/diagrams/13-antipatterns-grid.svg | 4 ++-- .../14-protocol-roundtrips.excalidraw | 8 ++++---- assets/diagrams/14-protocol-roundtrips.svg | 4 ++-- assets/diagrams/14-streaming-modes.excalidraw | 16 +++++++-------- assets/diagrams/14-streaming-modes.svg | 8 ++++---- assets/diagrams/14-three-paradigms.excalidraw | 12 +++++------ assets/diagrams/14-three-paradigms.svg | 6 +++--- .../15-deprecation-lifecycle.excalidraw | 4 ++-- assets/diagrams/15-deprecation-lifecycle.svg | 2 +- assets/diagrams/15-grpc-breaking.excalidraw | 12 +++++------ assets/diagrams/15-grpc-breaking.svg | 6 +++--- assets/diagrams/16-ws-backplane.excalidraw | 4 ++-- assets/diagrams/16-ws-backplane.svg | 2 +- .../16-ws-protobuf-envelope.excalidraw | 4 ++-- assets/diagrams/16-ws-protobuf-envelope.svg | 2 +- assets/diagrams/16-ws-resume.excalidraw | 4 ++-- assets/diagrams/16-ws-resume.svg | 4 ++-- .../diagrams/16-ws-scaling-problem.excalidraw | 4 ++-- assets/diagrams/16-ws-scaling-problem.svg | 2 +- .../diagrams/17-saga-compensation.excalidraw | 12 +++++------ assets/diagrams/17-saga-compensation.svg | 6 +++--- assets/diagrams/17-saga-context.excalidraw | 8 ++++---- assets/diagrams/17-saga-context.svg | 4 ++-- assets/diagrams/18-graphql-errors.excalidraw | 4 ++-- assets/diagrams/18-graphql-errors.svg | 2 +- assets/diagrams/18-grpc-errors.excalidraw | 20 +++++++++---------- assets/diagrams/18-grpc-errors.svg | 10 +++++----- assets/diagrams/18-kafka-dlq.excalidraw | 4 ++-- assets/diagrams/18-kafka-dlq.svg | 2 +- assets/diagrams/18-one-error-model.excalidraw | 4 ++-- assets/diagrams/18-one-error-model.svg | 2 +- assets/diagrams/18-rest-errors.excalidraw | 12 +++++------ assets/diagrams/18-rest-errors.svg | 6 +++--- assets/diagrams/18-retry-storm.excalidraw | 8 ++++---- assets/diagrams/18-retry-storm.svg | 4 ++-- assets/diagrams/19-context-mapping.excalidraw | 4 ++-- assets/diagrams/19-context-mapping.svg | 2 +- assets/diagrams/19-hexagonal-ports.excalidraw | 8 ++++---- assets/diagrams/19-hexagonal-ports.svg | 4 ++-- assets/diagrams/19-strategic-ddd.excalidraw | 12 +++++------ assets/diagrams/19-strategic-ddd.svg | 6 +++--- assets/diagrams/20-connascence.excalidraw | 8 ++++---- assets/diagrams/20-connascence.svg | 4 ++-- .../diagrams/20-coupling-quadrant.excalidraw | 12 +++++------ assets/diagrams/20-coupling-quadrant.svg | 6 +++--- .../diagrams/20-cynefin-coupling.excalidraw | 16 +++++++-------- assets/diagrams/20-cynefin-coupling.svg | 8 ++++---- .../diagrams/20-three-dimensions.excalidraw | 4 ++-- assets/diagrams/20-three-dimensions.svg | 2 +- assets/diagrams/21-per-workload.excalidraw | 12 +++++------ assets/diagrams/21-per-workload.svg | 6 +++--- .../diagrams/21-shutdown-sequence.excalidraw | 4 ++-- assets/diagrams/21-shutdown-sequence.svg | 2 +- .../22-business-rule-routing.excalidraw | 4 ++-- assets/diagrams/22-business-rule-routing.svg | 2 +- assets/diagrams/22-hop-cost.excalidraw | 4 ++-- assets/diagrams/22-hop-cost.svg | 2 +- assets/diagrams/22-l4-vs-l7.excalidraw | 4 ++-- assets/diagrams/22-l4-vs-l7.svg | 2 +- assets/diagrams/22-l7-journey.excalidraw | 4 ++-- assets/diagrams/22-l7-journey.svg | 2 +- assets/diagrams/22-l7-layers.excalidraw | 16 +++++++-------- assets/diagrams/22-l7-layers.svg | 8 ++++---- assets/diagrams/22-sticky-sessions.excalidraw | 4 ++-- assets/diagrams/22-sticky-sessions.svg | 2 +- .../diagrams/22-traffic-steering.excalidraw | 4 ++-- assets/diagrams/22-traffic-steering.svg | 2 +- assets/diagrams/23-strangler-fig.excalidraw | 8 ++++---- assets/diagrams/23-strangler-fig.svg | 4 ++-- .../24-decomposed-databases.excalidraw | 8 ++++---- assets/diagrams/24-decomposed-databases.svg | 4 ++-- .../24-decorating-collaborator.excalidraw | 4 ++-- .../diagrams/24-decorating-collaborator.svg | 2 +- .../diagrams/24-modular-monolith.excalidraw | 8 ++++---- assets/diagrams/24-modular-monolith.svg | 4 ++-- assets/diagrams/24-monolith-unit.excalidraw | 8 ++++---- assets/diagrams/24-monolith-unit.svg | 4 ++-- assets/diagrams/24-proxy-step-zero.excalidraw | 4 ++-- assets/diagrams/24-proxy-step-zero.svg | 2 +- assets/diagrams/24-shared-database.excalidraw | 4 ++-- assets/diagrams/24-shared-database.svg | 2 +- assets/diagrams/24-write-back.excalidraw | 4 ++-- assets/diagrams/24-write-back.svg | 2 +- assets/diagrams/24-write-through.excalidraw | 4 ++-- assets/diagrams/24-write-through.svg | 2 +- assets/diagrams/25-amplification.excalidraw | 4 ++-- assets/diagrams/25-amplification.svg | 2 +- .../diagrams/25-failure-taxonomy.excalidraw | 4 ++-- assets/diagrams/25-failure-taxonomy.svg | 2 +- .../diagrams/25-istio-resilience.excalidraw | 8 ++++---- assets/diagrams/25-istio-resilience.svg | 4 ++-- .../diagrams/25-network-partition.excalidraw | 16 +++++++-------- assets/diagrams/25-network-partition.svg | 8 ++++---- assets/diagrams/25-partial-failure.excalidraw | 16 +++++++-------- assets/diagrams/25-partial-failure.svg | 8 ++++---- assets/diagrams/25-split-brain.excalidraw | 4 ++-- assets/diagrams/25-split-brain.svg | 2 +- .../diagrams/25-timeouts-deadline.excalidraw | 4 ++-- assets/diagrams/25-timeouts-deadline.svg | 2 +- assets/diagrams/26-deploy-release.excalidraw | 4 ++-- assets/diagrams/26-deploy-release.svg | 2 +- .../26-evaluation-architecture.excalidraw | 4 ++-- .../diagrams/26-evaluation-architecture.svg | 2 +- assets/diagrams/26-flag-lifecycle.excalidraw | 4 ++-- assets/diagrams/26-flag-lifecycle.svg | 2 +- assets/diagrams/26-flag-types.excalidraw | 12 +++++------ assets/diagrams/26-flag-types.svg | 6 +++--- .../26-flags-control-plane.excalidraw | 4 ++-- assets/diagrams/26-flags-control-plane.svg | 2 +- .../26-progressive-rollout.excalidraw | 4 ++-- assets/diagrams/26-progressive-rollout.svg | 2 +- assets/diagrams/27-black-box.excalidraw | 4 ++-- assets/diagrams/27-black-box.svg | 2 +- assets/diagrams/27-ci-gate.excalidraw | 4 ++-- assets/diagrams/27-ci-gate.svg | 2 +- .../diagrams/27-collection-anatomy.excalidraw | 4 ++-- assets/diagrams/27-collection-anatomy.svg | 2 +- assets/diagrams/27-newman-run.excalidraw | 4 ++-- assets/diagrams/27-newman-run.svg | 2 +- assets/diagrams/27-test-pyramid.excalidraw | 16 +++++++-------- assets/diagrams/27-test-pyramid.svg | 8 ++++---- .../diagrams/29-container-layers.excalidraw | 4 ++-- assets/diagrams/29-container-layers.svg | 2 +- .../diagrams/29-dotnet-compilation.excalidraw | 4 ++-- assets/diagrams/29-dotnet-compilation.svg | 2 +- .../diagrams/29-kestrel-pipeline.excalidraw | 4 ++-- assets/diagrams/29-kestrel-pipeline.svg | 2 +- .../diagrams/30-signalr-backplane.excalidraw | 4 ++-- assets/diagrams/30-signalr-backplane.svg | 2 +- .../diagrams/advisory-ci-pipeline.excalidraw | 4 ++-- assets/diagrams/advisory-ci-pipeline.svg | 2 +- .../advisory-team-ownership.excalidraw | 4 ++-- assets/diagrams/advisory-team-ownership.svg | 2 +- .../advisory-tier-evaluation.excalidraw | 12 +++++------ assets/diagrams/advisory-tier-evaluation.svg | 6 +++--- assets/diagrams/policy-ci-pipeline.excalidraw | 4 ++-- assets/diagrams/policy-ci-pipeline.svg | 2 +- assets/diagrams/policy-gitops-flow.excalidraw | 4 ++-- assets/diagrams/policy-gitops-flow.svg | 2 +- scripts/gen_06_diagram.py | 8 ++++---- scripts/gen_07_diagram.py | 2 +- scripts/gen_27_diagrams.py | 4 ++-- scripts/gen_29_diagrams.py | 14 ++++++------- scripts/gen_30_diagrams.py | 8 ++++---- scripts/gen_31_diagrams.py | 6 +++--- scripts/gen_32_diagrams.py | 6 +++--- scripts/generate_example_diagrams.py | 2 +- 244 files changed, 617 insertions(+), 617 deletions(-) diff --git a/assets/diagrams/00-patterns-literacy.excalidraw b/assets/diagrams/00-patterns-literacy.excalidraw index 7d9686ba..eeb40096 100644 --- a/assets/diagrams/00-patterns-literacy.excalidraw +++ b/assets/diagrams/00-patterns-literacy.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "System design patterns \u2014 this book", + "text": "System design patterns: this book", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "System design patterns \u2014 this book", + "originalText": "System design patterns: this book", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/00-patterns-literacy.svg b/assets/diagrams/00-patterns-literacy.svg index 157a4ec4..d37065de 100644 --- a/assets/diagrams/00-patterns-literacy.svg +++ b/assets/diagrams/00-patterns-literacy.svg @@ -1,7 +1,7 @@ -System design patterns — this book +System design patterns: this book sagas · outbox · CQRS · caching · strangler fig · bulkhead · L7 routing Architecture patterns diff --git a/assets/diagrams/01-factors-mapped.excalidraw b/assets/diagrams/01-factors-mapped.excalidraw index c99485a5..d197af19 100644 --- a/assets/diagrams/01-factors-mapped.excalidraw +++ b/assets/diagrams/01-factors-mapped.excalidraw @@ -966,13 +966,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Postgres \u00b7 Kafka (Strimzi) \u00b7 Apicurio \u2014 swappable", + "text": "Postgres \u00b7 Kafka (Strimzi) \u00b7 Apicurio: swappable", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Postgres \u00b7 Kafka (Strimzi) \u00b7 Apicurio \u2014 swappable", + "originalText": "Postgres \u00b7 Kafka (Strimzi) \u00b7 Apicurio: swappable", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/01-factors-mapped.svg b/assets/diagrams/01-factors-mapped.svg index c1c67d93..b7ed4149 100644 --- a/assets/diagrams/01-factors-mapped.svg +++ b/assets/diagrams/01-factors-mapped.svg @@ -29,7 +29,7 @@ backing services Backing services as URLs -Postgres · Kafka (Strimzi) · Apicurio — swappable +Postgres · Kafka (Strimzi) · Apicurio: swappable §4·5 diff --git a/assets/diagrams/01-six-pillars.excalidraw b/assets/diagrams/01-six-pillars.excalidraw index f8f8af69..5cf5c64f 100644 --- a/assets/diagrams/01-six-pillars.excalidraw +++ b/assets/diagrams/01-six-pillars.excalidraw @@ -1182,13 +1182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes \u2014 not a checklist of tools", + "text": "cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes: not a checklist of tools", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes \u2014 not a checklist of tools", + "originalText": "cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes: not a checklist of tools", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/01-six-pillars.svg b/assets/diagrams/01-six-pillars.svg index a61be5dc..03b0b45b 100644 --- a/assets/diagrams/01-six-pillars.svg +++ b/assets/diagrams/01-six-pillars.svg @@ -33,5 +33,5 @@ -cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes — not a checklist of tools +cloud-native is a set of runtime properties an API must exhibit to thrive on Kubernetes: not a checklist of tools \ No newline at end of file diff --git a/assets/diagrams/01-twelve-factors.excalidraw b/assets/diagrams/01-twelve-factors.excalidraw index f1b9f99a..8d8a3a38 100644 --- a/assets/diagrams/01-twelve-factors.excalidraw +++ b/assets/diagrams/01-twelve-factors.excalidraw @@ -1204,13 +1204,13 @@ "updated": 1, "link": null, "locked": false, - "text": "don't memorise the list \u2014 recognise that most are now platform concerns, and only a few are yours to write", + "text": "don't memorise the list: recognise that most are now platform concerns, and only a few are yours to write", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "don't memorise the list \u2014 recognise that most are now platform concerns, and only a few are yours to write", + "originalText": "don't memorise the list: recognise that most are now platform concerns, and only a few are yours to write", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/01-twelve-factors.svg b/assets/diagrams/01-twelve-factors.svg index 4445549b..e0d9ad4c 100644 --- a/assets/diagrams/01-twelve-factors.svg +++ b/assets/diagrams/01-twelve-factors.svg @@ -36,5 +36,5 @@ 12 Admin processes run as one-off tasks -don't memorise the list — recognise that most are now platform concerns, and only a few are yours to write +don't memorise the list: recognise that most are now platform concerns, and only a few are yours to write \ No newline at end of file diff --git a/assets/diagrams/02-pick-protocol.excalidraw b/assets/diagrams/02-pick-protocol.excalidraw index 240014d9..0517833f 100644 --- a/assets/diagrams/02-pick-protocol.excalidraw +++ b/assets/diagrams/02-pick-protocol.excalidraw @@ -1092,13 +1092,13 @@ "updated": 1, "link": null, "locked": false, - "text": "pick the protocol for the interaction, not the org chart \u2014 most systems use all four; the skill is matching each call to the right style", + "text": "pick the protocol for the interaction, not the org chart: most systems use all four; the skill is matching each call to the right style", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "pick the protocol for the interaction, not the org chart \u2014 most systems use all four; the skill is matching each call to the right style", + "originalText": "pick the protocol for the interaction, not the org chart: most systems use all four; the skill is matching each call to the right style", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/02-pick-protocol.svg b/assets/diagrams/02-pick-protocol.svg index 67061a8c..28a41c66 100644 --- a/assets/diagrams/02-pick-protocol.svg +++ b/assets/diagrams/02-pick-protocol.svg @@ -32,5 +32,5 @@ Kafka / Pulsar async -pick the protocol for the interaction, not the org chart — most systems use all four; the skill is matching each call to the right style +pick the protocol for the interaction, not the org chart: most systems use all four; the skill is matching each call to the right style \ No newline at end of file diff --git a/assets/diagrams/02-sync-vs-async.excalidraw b/assets/diagrams/02-sync-vs-async.excalidraw index 93a613aa..b4052368 100644 --- a/assets/diagrams/02-sync-vs-async.excalidraw +++ b/assets/diagrams/02-sync-vs-async.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "synchronous \u2014 coupled in time & availability", + "text": "synchronous: coupled in time & availability", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "synchronous \u2014 coupled in time & availability", + "originalText": "synchronous: coupled in time & availability", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "asynchronous \u2014 emit a fact, consumers catch up", + "text": "asynchronous: emit a fact, consumers catch up", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "asynchronous \u2014 emit a fact, consumers catch up", + "originalText": "asynchronous: emit a fact, consumers catch up", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/02-sync-vs-async.svg b/assets/diagrams/02-sync-vs-async.svg index b0721055..1abed749 100644 --- a/assets/diagrams/02-sync-vs-async.svg +++ b/assets/diagrams/02-sync-vs-async.svg @@ -1,9 +1,9 @@ -synchronous — coupled in time & availability +synchronous: coupled in time & availability -asynchronous — emit a fact, consumers catch up +asynchronous: emit a fact, consumers catch up order diff --git a/assets/diagrams/03-composition.excalidraw b/assets/diagrams/03-composition.excalidraw index c661fa2b..a470148c 100644 --- a/assets/diagrams/03-composition.excalidraw +++ b/assets/diagrams/03-composition.excalidraw @@ -619,13 +619,13 @@ "updated": 1, "link": null, "locked": false, - "text": "services stay unaware of each other \u2014 the gateway owns composition", + "text": "services stay unaware of each other: the gateway owns composition", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "services stay unaware of each other \u2014 the gateway owns composition", + "originalText": "services stay unaware of each other: the gateway owns composition", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/03-composition.svg b/assets/diagrams/03-composition.svg index 8711999b..f1a868f2 100644 --- a/assets/diagrams/03-composition.svg +++ b/assets/diagrams/03-composition.svg @@ -20,5 +20,5 @@ stock · gRPC stock · gRPC -services stay unaware of each other — the gateway owns composition +services stay unaware of each other: the gateway owns composition \ No newline at end of file diff --git a/assets/diagrams/03-three-ways.excalidraw b/assets/diagrams/03-three-ways.excalidraw index 04782519..fbc2dc7f 100644 --- a/assets/diagrams/03-three-ways.excalidraw +++ b/assets/diagrams/03-three-ways.excalidraw @@ -721,13 +721,13 @@ "updated": 1, "link": null, "locked": false, - "text": "aggregation moves toward the client as coupling needs loosen \u2014 compose at a gateway/BFF, never by chaining calls inside services", + "text": "aggregation moves toward the client as coupling needs loosen: compose at a gateway/BFF, never by chaining calls inside services", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "aggregation moves toward the client as coupling needs loosen \u2014 compose at a gateway/BFF, never by chaining calls inside services", + "originalText": "aggregation moves toward the client as coupling needs loosen: compose at a gateway/BFF, never by chaining calls inside services", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/03-three-ways.svg b/assets/diagrams/03-three-ways.svg index 896e69c5..8a8afdc7 100644 --- a/assets/diagrams/03-three-ways.svg +++ b/assets/diagrams/03-three-ways.svg @@ -21,5 +21,5 @@ gateway plans query read-optimised -aggregation moves toward the client as coupling needs loosen — compose at a gateway/BFF, never by chaining calls inside services +aggregation moves toward the client as coupling needs loosen: compose at a gateway/BFF, never by chaining calls inside services \ No newline at end of file diff --git a/assets/diagrams/04-cqrs.excalidraw b/assets/diagrams/04-cqrs.excalidraw index adbf1a93..dd1943f6 100644 --- a/assets/diagrams/04-cqrs.excalidraw +++ b/assets/diagrams/04-cqrs.excalidraw @@ -1435,13 +1435,13 @@ "updated": 1, "link": null, "locked": false, - "text": "write side optimises for invariants; read side for query patterns \u2014 eventually consistent, a small lag between them. Use only when the shapes differ.", + "text": "write side optimises for invariants; read side for query patterns: eventually consistent, a small lag between them. Use only when the shapes differ.", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "write side optimises for invariants; read side for query patterns \u2014 eventually consistent, a small lag between them. Use only when the shapes differ.", + "originalText": "write side optimises for invariants; read side for query patterns: eventually consistent, a small lag between them. Use only when the shapes differ.", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/04-cqrs.svg b/assets/diagrams/04-cqrs.svg index 33fc1f93..df43d018 100644 --- a/assets/diagrams/04-cqrs.svg +++ b/assets/diagrams/04-cqrs.svg @@ -44,5 +44,5 @@ queries queries -write side optimises for invariants; read side for query patterns — eventually consistent, a small lag between them. Use only when the shapes differ. +write side optimises for invariants; read side for query patterns: eventually consistent, a small lag between them. Use only when the shapes differ. \ No newline at end of file diff --git a/assets/diagrams/04-db-per-service.excalidraw b/assets/diagrams/04-db-per-service.excalidraw index f1e5844b..b72c78d7 100644 --- a/assets/diagrams/04-db-per-service.excalidraw +++ b/assets/diagrams/04-db-per-service.excalidraw @@ -980,13 +980,13 @@ "updated": 1, "link": null, "locked": false, - "text": "polyglot persistence \u2014 pick the store per workload (relational \u00b7 KV \u00b7 search \u00b7 object)", + "text": "polyglot persistence: pick the store per workload (relational \u00b7 KV \u00b7 search \u00b7 object)", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "polyglot persistence \u2014 pick the store per workload (relational \u00b7 KV \u00b7 search \u00b7 object)", + "originalText": "polyglot persistence: pick the store per workload (relational \u00b7 KV \u00b7 search \u00b7 object)", "lineHeight": 1.25, "baseline": 14 }, @@ -1187,13 +1187,13 @@ "updated": 1, "link": null, "locked": false, - "text": "sharing a database couples deploys and schemas \u2014 the most common way a 'microservice' system quietly fails", + "text": "sharing a database couples deploys and schemas: the most common way a 'microservice' system quietly fails", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "sharing a database couples deploys and schemas \u2014 the most common way a 'microservice' system quietly fails", + "originalText": "sharing a database couples deploys and schemas: the most common way a 'microservice' system quietly fails", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/04-db-per-service.svg b/assets/diagrams/04-db-per-service.svg index d48c27e3..a3adb7aa 100644 --- a/assets/diagrams/04-db-per-service.svg +++ b/assets/diagrams/04-db-per-service.svg @@ -29,10 +29,10 @@ private schema CloudNativePG -polyglot persistence — pick the store per workload (relational · KV · search · object) +polyglot persistence: pick the store per workload (relational · KV · search · object) -sharing a database couples deploys and schemas — the most common way a 'microservice' system quietly fails +sharing a database couples deploys and schemas: the most common way a 'microservice' system quietly fails \ No newline at end of file diff --git a/assets/diagrams/04-saga.excalidraw b/assets/diagrams/04-saga.excalidraw index e4cb7d48..73fda8df 100644 --- a/assets/diagrams/04-saga.excalidraw +++ b/assets/diagrams/04-saga.excalidraw @@ -831,13 +831,13 @@ "updated": 1, "link": null, "locked": false, - "text": "happy path \u2014 each local commit emits the event that triggers the next step", + "text": "happy path: each local commit emits the event that triggers the next step", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "happy path \u2014 each local commit emits the event that triggers the next step", + "originalText": "happy path: each local commit emits the event that triggers the next step", "lineHeight": 1.25, "baseline": 12 }, @@ -866,13 +866,13 @@ "updated": 1, "link": null, "locked": false, - "text": "no two-phase commit across services; a failure triggers compensating actions, not rollbacks \u2014 sagas go deep in Appendix D", + "text": "no two-phase commit across services; a failure triggers compensating actions, not rollbacks: sagas go deep in Appendix D", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "no two-phase commit across services; a failure triggers compensating actions, not rollbacks \u2014 sagas go deep in Appendix D", + "originalText": "no two-phase commit across services; a failure triggers compensating actions, not rollbacks: sagas go deep in Appendix D", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/04-saga.svg b/assets/diagrams/04-saga.svg index fa440cf2..e1a460e3 100644 --- a/assets/diagrams/04-saga.svg +++ b/assets/diagrams/04-saga.svg @@ -23,6 +23,6 @@ -happy path — each local commit emits the event that triggers the next step -no two-phase commit across services; a failure triggers compensating actions, not rollbacks — sagas go deep in Appendix D +happy path: each local commit emits the event that triggers the next step +no two-phase commit across services; a failure triggers compensating actions, not rollbacks: sagas go deep in Appendix D \ No newline at end of file diff --git a/assets/diagrams/05-amqp-architecture.excalidraw b/assets/diagrams/05-amqp-architecture.excalidraw index bf6ca0a1..0fe45564 100644 --- a/assets/diagrams/05-amqp-architecture.excalidraw +++ b/assets/diagrams/05-amqp-architecture.excalidraw @@ -1182,13 +1182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "routing lives in the exchange; an acked message is removed (no replay) \u2014 excels at work distribution, RPC, and rich routing", + "text": "routing lives in the exchange; an acked message is removed (no replay): excels at work distribution, RPC, and rich routing", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "routing lives in the exchange; an acked message is removed (no replay) \u2014 excels at work distribution, RPC, and rich routing", + "originalText": "routing lives in the exchange; an acked message is removed (no replay): excels at work distribution, RPC, and rich routing", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-amqp-architecture.svg b/assets/diagrams/05-amqp-architecture.svg index 855ac260..56c53013 100644 --- a/assets/diagrams/05-amqp-architecture.svg +++ b/assets/diagrams/05-amqp-architecture.svg @@ -39,5 +39,5 @@ nack / expire nack / expire -routing lives in the exchange; an acked message is removed (no replay) — excels at work distribution, RPC, and rich routing +routing lives in the exchange; an acked message is removed (no replay): excels at work distribution, RPC, and rich routing \ No newline at end of file diff --git a/assets/diagrams/05-checkpoint-recovery.excalidraw b/assets/diagrams/05-checkpoint-recovery.excalidraw index 7a2d122b..4e19c5f7 100644 --- a/assets/diagrams/05-checkpoint-recovery.excalidraw +++ b/assets/diagrams/05-checkpoint-recovery.excalidraw @@ -732,13 +732,13 @@ "updated": 1, "link": null, "locked": false, - "text": "snapshot state and input offset together; on failure restore and replay from there \u2014 and rewind to reprocess and rebuild", + "text": "snapshot state and input offset together; on failure restore and replay from there, and rewind to reprocess and rebuild", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "snapshot state and input offset together; on failure restore and replay from there \u2014 and rewind to reprocess and rebuild", + "originalText": "snapshot state and input offset together; on failure restore and replay from there, and rewind to reprocess and rebuild", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-checkpoint-recovery.svg b/assets/diagrams/05-checkpoint-recovery.svg index 36072487..62771ebb 100644 --- a/assets/diagrams/05-checkpoint-recovery.svg +++ b/assets/diagrams/05-checkpoint-recovery.svg @@ -24,5 +24,5 @@ resume resume -snapshot state and input offset together; on failure restore and replay from there — and rewind to reprocess and rebuild +snapshot state and input offset together; on failure restore and replay from there, and rewind to reprocess and rebuild \ No newline at end of file diff --git a/assets/diagrams/05-choreography-orchestration.excalidraw b/assets/diagrams/05-choreography-orchestration.excalidraw index 6b03d2dd..d8eac577 100644 --- a/assets/diagrams/05-choreography-orchestration.excalidraw +++ b/assets/diagrams/05-choreography-orchestration.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Choreography \u2014 each service reacts to the last event, no coordinator", + "text": "Choreography: each service reacts to the last event, no coordinator", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Choreography \u2014 each service reacts to the last event, no coordinator", + "originalText": "Choreography: each service reacts to the last event, no coordinator", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Orchestration \u2014 a central coordinator issues commands and tracks replies", + "text": "Orchestration: a central coordinator issues commands and tracks replies", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Orchestration \u2014 a central coordinator issues commands and tracks replies", + "originalText": "Orchestration: a central coordinator issues commands and tracks replies", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/05-choreography-orchestration.svg b/assets/diagrams/05-choreography-orchestration.svg index 3858cdab..afa90de9 100644 --- a/assets/diagrams/05-choreography-orchestration.svg +++ b/assets/diagrams/05-choreography-orchestration.svg @@ -1,9 +1,9 @@ -Choreography — each service reacts to the last event, no coordinator +Choreography: each service reacts to the last event, no coordinator -Orchestration — a central coordinator issues commands and tracks replies +Orchestration: a central coordinator issues commands and tracks replies order-service diff --git a/assets/diagrams/05-ecst-vs-notification.excalidraw b/assets/diagrams/05-ecst-vs-notification.excalidraw index ec1bded9..f823ec7c 100644 --- a/assets/diagrams/05-ecst-vs-notification.excalidraw +++ b/assets/diagrams/05-ecst-vs-notification.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Event notification \u2014 thin event, the consumer must call back", + "text": "Event notification: thin event, the consumer must call back", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Event notification \u2014 thin event, the consumer must call back", + "originalText": "Event notification: thin event, the consumer must call back", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Event-carried state transfer \u2014 fat event, a local view", + "text": "Event-carried state transfer: fat event, a local view", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Event-carried state transfer \u2014 fat event, a local view", + "originalText": "Event-carried state transfer: fat event, a local view", "lineHeight": 1.25, "baseline": 12 }, @@ -914,13 +914,13 @@ "updated": 1, "link": null, "locked": false, - "text": "carry enough state and the consumer never calls back \u2014 reads go local and the source decouples", + "text": "carry enough state and the consumer never calls back: reads go local and the source decouples", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "carry enough state and the consumer never calls back \u2014 reads go local and the source decouples", + "originalText": "carry enough state and the consumer never calls back: reads go local and the source decouples", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-ecst-vs-notification.svg b/assets/diagrams/05-ecst-vs-notification.svg index cc118ff9..1291bc47 100644 --- a/assets/diagrams/05-ecst-vs-notification.svg +++ b/assets/diagrams/05-ecst-vs-notification.svg @@ -1,9 +1,9 @@ -Event notification — thin event, the consumer must call back +Event notification: thin event, the consumer must call back -Event-carried state transfer — fat event, a local view +Event-carried state transfer: fat event, a local view source service @@ -30,5 +30,5 @@ fold → upsert fold → upsert -carry enough state and the consumer never calls back — reads go local and the source decouples +carry enough state and the consumer never calls back: reads go local and the source decouples \ No newline at end of file diff --git a/assets/diagrams/05-event-backbone.excalidraw b/assets/diagrams/05-event-backbone.excalidraw index e77e7f68..f45c5970 100644 --- a/assets/diagrams/05-event-backbone.excalidraw +++ b/assets/diagrams/05-event-backbone.excalidraw @@ -726,13 +726,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the producer names none of them \u2014 add a consumer without redeploying it", + "text": "the producer names none of them: add a consumer without redeploying it", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the producer names none of them \u2014 add a consumer without redeploying it", + "originalText": "the producer names none of them: add a consumer without redeploying it", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/05-event-backbone.svg b/assets/diagrams/05-event-backbone.svg index 3832c812..dac492b9 100644 --- a/assets/diagrams/05-event-backbone.svg +++ b/assets/diagrams/05-event-backbone.svg @@ -21,5 +21,5 @@ -the producer names none of them — add a consumer without redeploying it +the producer names none of them: add a consumer without redeploying it \ No newline at end of file diff --git a/assets/diagrams/05-event-time-watermark.excalidraw b/assets/diagrams/05-event-time-watermark.excalidraw index dd403805..4e8b747c 100644 --- a/assets/diagrams/05-event-time-watermark.excalidraw +++ b/assets/diagrams/05-event-time-watermark.excalidraw @@ -859,13 +859,13 @@ "updated": 1, "link": null, "locked": false, - "text": "key computation off event time, not the wall clock \u2014 replaying the log then yields the same answer", + "text": "key computation off event time, not the wall clock: replaying the log then yields the same answer", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "key computation off event time, not the wall clock \u2014 replaying the log then yields the same answer", + "originalText": "key computation off event time, not the wall clock: replaying the log then yields the same answer", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-event-time-watermark.svg b/assets/diagrams/05-event-time-watermark.svg index 808f8b30..0f8ec45d 100644 --- a/assets/diagrams/05-event-time-watermark.svg +++ b/assets/diagrams/05-event-time-watermark.svg @@ -26,5 +26,5 @@ past T past T -key computation off event time, not the wall clock — replaying the log then yields the same answer +key computation off event time, not the wall clock: replaying the log then yields the same answer \ No newline at end of file diff --git a/assets/diagrams/05-eventification.excalidraw b/assets/diagrams/05-eventification.excalidraw index dfb1d41f..5da84b68 100644 --- a/assets/diagrams/05-eventification.excalidraw +++ b/assets/diagrams/05-eventification.excalidraw @@ -654,13 +654,13 @@ "updated": 1, "link": null, "locked": false, - "text": "table \u2192 stream (eventify) and stream \u2192 table (materialize) are two views of the same data \u2014 the log is the bridge", + "text": "table \u2192 stream (eventify) and stream \u2192 table (materialize) are two views of the same data: the log is the bridge", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "table \u2192 stream (eventify) and stream \u2192 table (materialize) are two views of the same data \u2014 the log is the bridge", + "originalText": "table \u2192 stream (eventify) and stream \u2192 table (materialize) are two views of the same data: the log is the bridge", "lineHeight": 1.25, "baseline": 10.5 }, diff --git a/assets/diagrams/05-eventification.svg b/assets/diagrams/05-eventification.svg index edc5540e..43956a0b 100644 --- a/assets/diagrams/05-eventification.svg +++ b/assets/diagrams/05-eventification.svg @@ -21,6 +21,6 @@ consume consume -table → stream (eventify) and stream → table (materialize) are two views of the same data — the log is the bridge +table → stream (eventify) and stream → table (materialize) are two views of the same data: the log is the bridge the outbox (write the event in the same transaction) is the alternative when you own the writer \ No newline at end of file diff --git a/assets/diagrams/05-kafka-architecture.excalidraw b/assets/diagrams/05-kafka-architecture.excalidraw index 718cdcb8..cc630c68 100644 --- a/assets/diagrams/05-kafka-architecture.excalidraw +++ b/assets/diagrams/05-kafka-architecture.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Kafka cluster \u2014 partitioned, replicated log", + "text": "Kafka cluster: partitioned, replicated log", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Kafka cluster \u2014 partitioned, replicated log", + "originalText": "Kafka cluster: partitioned, replicated log", "lineHeight": 1.25, "baseline": 12 }, @@ -843,13 +843,13 @@ "updated": 1, "link": null, "locked": false, - "text": "retained by time or size \u2014 not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads", + "text": "retained by time or size: not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "retained by time or size \u2014 not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads", + "originalText": "retained by time or size: not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-kafka-architecture.svg b/assets/diagrams/05-kafka-architecture.svg index ceb14e6f..817e6213 100644 --- a/assets/diagrams/05-kafka-architecture.svg +++ b/assets/diagrams/05-kafka-architecture.svg @@ -1,7 +1,7 @@ -Kafka cluster — partitioned, replicated log +Kafka cluster: partitioned, replicated log Producers keyed by entity @@ -25,5 +25,5 @@ append -retained by time or size — not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads +retained by time or size: not deleted on read; partitions = parallelism, replicas = durability, groups = independent reads \ No newline at end of file diff --git a/assets/diagrams/05-log-truth.excalidraw b/assets/diagrams/05-log-truth.excalidraw index f601e6bc..85884200 100644 --- a/assets/diagrams/05-log-truth.excalidraw +++ b/assets/diagrams/05-log-truth.excalidraw @@ -1221,13 +1221,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log \u2014 not a queue you drain; each consumer tracks its own offset", + "text": "Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log: not a queue you drain; each consumer tracks its own offset", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log \u2014 not a queue you drain; each consumer tracks its own offset", + "originalText": "Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log: not a queue you drain; each consumer tracks its own offset", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/05-log-truth.svg b/assets/diagrams/05-log-truth.svg index dfc51358..54697d84 100644 --- a/assets/diagrams/05-log-truth.svg +++ b/assets/diagrams/05-log-truth.svg @@ -36,5 +36,5 @@ offset 0 head (latest) Partitioned, append-only log -Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log — not a queue you drain; each consumer tracks its own offset +Kafka (Strimzi) and Pulsar give you a durable, replayable, partitioned log: not a queue you drain; each consumer tracks its own offset \ No newline at end of file diff --git a/assets/diagrams/05-pulsar-architecture.excalidraw b/assets/diagrams/05-pulsar-architecture.excalidraw index a7cbaa32..51d5a0b1 100644 --- a/assets/diagrams/05-pulsar-architecture.excalidraw +++ b/assets/diagrams/05-pulsar-architecture.excalidraw @@ -350,13 +350,13 @@ "updated": 1, "link": null, "locked": false, - "text": "object store \u2014 cold", + "text": "object store: cold", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "object store \u2014 cold", + "originalText": "object store: cold", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/05-pulsar-architecture.svg b/assets/diagrams/05-pulsar-architecture.svg index ea9d2678..05e58d73 100644 --- a/assets/diagrams/05-pulsar-architecture.svg +++ b/assets/diagrams/05-pulsar-architecture.svg @@ -10,7 +10,7 @@ bookies · segments Tiered storage -object store — cold +object store: cold Consumers exclusive / shared / failover / key_shared diff --git a/assets/diagrams/05-saga-compensation.excalidraw b/assets/diagrams/05-saga-compensation.excalidraw index 4fac6d47..12110596 100644 --- a/assets/diagrams/05-saga-compensation.excalidraw +++ b/assets/diagrams/05-saga-compensation.excalidraw @@ -690,13 +690,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each step is a local transaction; on a failure, run compensating actions in reverse \u2014 atomicity without a distributed lock (full treatment in Appendix D)", + "text": "each step is a local transaction; on a failure, run compensating actions in reverse: atomicity without a distributed lock (full treatment in Appendix D)", "fontSize": 10, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each step is a local transaction; on a failure, run compensating actions in reverse \u2014 atomicity without a distributed lock (full treatment in Appendix D)", + "originalText": "each step is a local transaction; on a failure, run compensating actions in reverse: atomicity without a distributed lock (full treatment in Appendix D)", "lineHeight": 1.25, "baseline": 10 } diff --git a/assets/diagrams/05-saga-compensation.svg b/assets/diagrams/05-saga-compensation.svg index 7f506fbe..6ee70f90 100644 --- a/assets/diagrams/05-saga-compensation.svg +++ b/assets/diagrams/05-saga-compensation.svg @@ -23,5 +23,5 @@ then refund then refund -each step is a local transaction; on a failure, run compensating actions in reverse — atomicity without a distributed lock (full treatment in Appendix D) +each step is a local transaction; on a failure, run compensating actions in reverse: atomicity without a distributed lock (full treatment in Appendix D) \ No newline at end of file diff --git a/assets/diagrams/05-sidecar.excalidraw b/assets/diagrams/05-sidecar.excalidraw index a687dd3c..437860b1 100644 --- a/assets/diagrams/05-sidecar.excalidraw +++ b/assets/diagrams/05-sidecar.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Pod \u2014 service A (Go)", + "text": "Pod: service A (Go)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Pod \u2014 service A (Go)", + "originalText": "Pod: service A (Go)", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Pod \u2014 service B (Python)", + "text": "Pod: service B (Python)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Pod \u2014 service B (Python)", + "originalText": "Pod: service B (Python)", "lineHeight": 1.25, "baseline": 12 }, @@ -956,13 +956,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the sidecar owns serde, schema, offsets, retries, and tracing \u2014 business logic stays pure and polyglot", + "text": "the sidecar owns serde, schema, offsets, retries, and tracing: business logic stays pure and polyglot", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the sidecar owns serde, schema, offsets, retries, and tracing \u2014 business logic stays pure and polyglot", + "originalText": "the sidecar owns serde, schema, offsets, retries, and tracing: business logic stays pure and polyglot", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-sidecar.svg b/assets/diagrams/05-sidecar.svg index e186e569..70cbdd08 100644 --- a/assets/diagrams/05-sidecar.svg +++ b/assets/diagrams/05-sidecar.svg @@ -1,9 +1,9 @@ -Pod — service A (Go) +Pod: service A (Go) -Pod — service B (Python) +Pod: service B (Python) business logic no broker client @@ -31,5 +31,5 @@ consume / produce consume / produce -the sidecar owns serde, schema, offsets, retries, and tracing — business logic stays pure and polyglot +the sidecar owns serde, schema, offsets, retries, and tracing: business logic stays pure and polyglot \ No newline at end of file diff --git a/assets/diagrams/05-sourcing-vs-streaming.excalidraw b/assets/diagrams/05-sourcing-vs-streaming.excalidraw index 0b83f23f..7de3ab17 100644 --- a/assets/diagrams/05-sourcing-vs-streaming.excalidraw +++ b/assets/diagrams/05-sourcing-vs-streaming.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Event sourcing \u2014 events are the state", + "text": "Event sourcing: events are the state", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Event sourcing \u2014 events are the state", + "originalText": "Event sourcing: events are the state", "lineHeight": 1.25, "baseline": 14 }, @@ -399,13 +399,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Event streaming \u2014 events are the transport", + "text": "Event streaming: events are the transport", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Event streaming \u2014 events are the transport", + "originalText": "Event streaming: events are the transport", "lineHeight": 1.25, "baseline": 14 }, @@ -714,13 +714,13 @@ "updated": 1, "link": null, "locked": false, - "text": "not mutually exclusive \u2014 full CQRS often does both: an event-sourced write side, stream-fed read projections", + "text": "not mutually exclusive: full CQRS often does both: an event-sourced write side, stream-fed read projections", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "not mutually exclusive \u2014 full CQRS often does both: an event-sourced write side, stream-fed read projections", + "originalText": "not mutually exclusive: full CQRS often does both: an event-sourced write side, stream-fed read projections", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/05-sourcing-vs-streaming.svg b/assets/diagrams/05-sourcing-vs-streaming.svg index bec06a78..35145141 100644 --- a/assets/diagrams/05-sourcing-vs-streaming.svg +++ b/assets/diagrams/05-sourcing-vs-streaming.svg @@ -1,7 +1,7 @@ -Event sourcing — events are the state +Event sourcing: events are the state aggregate state = fold(events from t0) the event log is the database @@ -11,7 +11,7 @@ fit: audit-heavy, financial, temporal queries where: Marten · EventStoreDB · Axon -Event streaming — events are the transport +Event streaming: events are the transport current state lives in a database events are facts emitted about changes @@ -20,6 +20,6 @@ fit: integration, fan-out, decoupling teams where: Kafka · Pulsar · NATS JetStream -not mutually exclusive — full CQRS often does both: an event-sourced write side, stream-fed read projections +not mutually exclusive: full CQRS often does both: an event-sourced write side, stream-fed read projections ask: is the event itself the source of truth (sourcing), or a fact propagated from a store (streaming)? \ No newline at end of file diff --git a/assets/diagrams/05-state-store-changelog.excalidraw b/assets/diagrams/05-state-store-changelog.excalidraw index 6ef802ab..b936e69e 100644 --- a/assets/diagrams/05-state-store-changelog.excalidraw +++ b/assets/diagrams/05-state-store-changelog.excalidraw @@ -858,13 +858,13 @@ "updated": 1, "link": null, "locked": false, - "text": "every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store \u2014 state is never lost", + "text": "every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store: state is never lost", "fontSize": 10.5, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store \u2014 state is never lost", + "originalText": "every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store: state is never lost", "lineHeight": 1.25, "baseline": 10.5 } diff --git a/assets/diagrams/05-state-store-changelog.svg b/assets/diagrams/05-state-store-changelog.svg index e309a5d4..8a6cc804 100644 --- a/assets/diagrams/05-state-store-changelog.svg +++ b/assets/diagrams/05-state-store-changelog.svg @@ -28,5 +28,5 @@ replay replay -every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store — state is never lost +every write also goes to the changelog; on failure or rebalance, replay it to rebuild the store: state is never lost \ No newline at end of file diff --git a/assets/diagrams/05-tools-landscape.excalidraw b/assets/diagrams/05-tools-landscape.excalidraw index 73f77719..57c73b5d 100644 --- a/assets/diagrams/05-tools-landscape.excalidraw +++ b/assets/diagrams/05-tools-landscape.excalidraw @@ -1285,13 +1285,13 @@ "updated": 1, "link": null, "locked": false, - "text": "SUBSTRATE \u2014 the durable log", + "text": "SUBSTRATE: the durable log", "fontSize": 13, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "SUBSTRATE \u2014 the durable log", + "originalText": "SUBSTRATE: the durable log", "lineHeight": 1.25, "baseline": 13 }, @@ -1320,13 +1320,13 @@ "updated": 1, "link": null, "locked": false, - "text": "COMPUTE \u2014 transform & aggregate", + "text": "COMPUTE: transform & aggregate", "fontSize": 13, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "COMPUTE \u2014 transform & aggregate", + "originalText": "COMPUTE: transform & aggregate", "lineHeight": 1.25, "baseline": 13 }, @@ -1355,13 +1355,13 @@ "updated": 1, "link": null, "locked": false, - "text": "MOVEMENT \u2014 data in & out", + "text": "MOVEMENT: data in & out", "fontSize": 13, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "MOVEMENT \u2014 data in & out", + "originalText": "MOVEMENT: data in & out", "lineHeight": 1.25, "baseline": 13 }, diff --git a/assets/diagrams/05-tools-landscape.svg b/assets/diagrams/05-tools-landscape.svg index 2e2e7b97..6189e791 100644 --- a/assets/diagrams/05-tools-landscape.svg +++ b/assets/diagrams/05-tools-landscape.svg @@ -36,8 +36,8 @@ -SUBSTRATE — the durable log -COMPUTE — transform & aggregate -MOVEMENT — data in & out +SUBSTRATE: the durable log +COMPUTE: transform & aggregate +MOVEMENT: data in & out typical pipeline: source DB → Debezium/NiFi → Kafka/Pulsar → Flink (windowed) → sink. These tools complement more than they compete (all Apache 2.0). \ No newline at end of file diff --git a/assets/diagrams/06-derive-streams.excalidraw b/assets/diagrams/06-derive-streams.excalidraw index 772ea9ef..53838d2d 100644 --- a/assets/diagrams/06-derive-streams.excalidraw +++ b/assets/diagrams/06-derive-streams.excalidraw @@ -936,13 +936,13 @@ "updated": 1, "link": null, "locked": false, - "text": "a streaming app is a topology of sources, processors, and sinks \u2014 stateful operators consume topics, keep local state, and emit derived streams", + "text": "a streaming app is a topology of sources, processors, and sinks: stateful operators consume topics, keep local state, and emit derived streams", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "a streaming app is a topology of sources, processors, and sinks \u2014 stateful operators consume topics, keep local state, and emit derived streams", + "originalText": "a streaming app is a topology of sources, processors, and sinks: stateful operators consume topics, keep local state, and emit derived streams", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/06-derive-streams.svg b/assets/diagrams/06-derive-streams.svg index 33ebb153..b0a633af 100644 --- a/assets/diagrams/06-derive-streams.svg +++ b/assets/diagrams/06-derive-streams.svg @@ -26,5 +26,5 @@ -a streaming app is a topology of sources, processors, and sinks — stateful operators consume topics, keep local state, and emit derived streams +a streaming app is a topology of sources, processors, and sinks: stateful operators consume topics, keep local state, and emit derived streams \ No newline at end of file diff --git a/assets/diagrams/06-scale-on-lag.excalidraw b/assets/diagrams/06-scale-on-lag.excalidraw index bf396eaf..09122d49 100644 --- a/assets/diagrams/06-scale-on-lag.excalidraw +++ b/assets/diagrams/06-scale-on-lag.excalidraw @@ -584,13 +584,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the right signal is consumer lag, not CPU \u2014 and it scales to zero", + "text": "the right signal is consumer lag, not CPU, and it scales to zero", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the right signal is consumer lag, not CPU \u2014 and it scales to zero", + "originalText": "the right signal is consumer lag, not CPU, and it scales to zero", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/06-scale-on-lag.svg b/assets/diagrams/06-scale-on-lag.svg index 2c9ded43..a91c2bbf 100644 --- a/assets/diagrams/06-scale-on-lag.svg +++ b/assets/diagrams/06-scale-on-lag.svg @@ -19,5 +19,5 @@ → 0 when quiet → 0 when quiet -the right signal is consumer lag, not CPU — and it scales to zero +the right signal is consumer lag, not CPU, and it scales to zero \ No newline at end of file diff --git a/assets/diagrams/06-window-types.excalidraw b/assets/diagrams/06-window-types.excalidraw index 0bc17684..c45a08d6 100644 --- a/assets/diagrams/06-window-types.excalidraw +++ b/assets/diagrams/06-window-types.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Tumbling \u2014 fixed, no overlap", + "text": "Tumbling: fixed, no overlap", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Tumbling \u2014 fixed, no overlap", + "originalText": "Tumbling: fixed, no overlap", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Hopping (sliding) \u2014 fixed, overlapping", + "text": "Hopping (sliding): fixed, overlapping", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Hopping (sliding) \u2014 fixed, overlapping", + "originalText": "Hopping (sliding): fixed, overlapping", "lineHeight": 1.25, "baseline": 12 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Session \u2014 variable, gap-based", + "text": "Session: variable, gap-based", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Session \u2014 variable, gap-based", + "originalText": "Session: variable, gap-based", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/06-window-types.svg b/assets/diagrams/06-window-types.svg index 7797458b..233ee3e3 100644 --- a/assets/diagrams/06-window-types.svg +++ b/assets/diagrams/06-window-types.svg @@ -1,11 +1,11 @@ -Tumbling — fixed, no overlap +Tumbling: fixed, no overlap -Hopping (sliding) — fixed, overlapping +Hopping (sliding): fixed, overlapping -Session — variable, gap-based +Session: variable, gap-based Window 1 00:00 – 05:00 diff --git a/assets/diagrams/07-jobs-cronjobs.excalidraw b/assets/diagrams/07-jobs-cronjobs.excalidraw index 6a4393e3..daa573bf 100644 --- a/assets/diagrams/07-jobs-cronjobs.excalidraw +++ b/assets/diagrams/07-jobs-cronjobs.excalidraw @@ -637,13 +637,13 @@ "updated": 1, "link": null, "locked": false, - "text": "not everything is a request \u2014 long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request", + "text": "not everything is a request: long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "not everything is a request \u2014 long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request", + "originalText": "not everything is a request: long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/07-jobs-cronjobs.svg b/assets/diagrams/07-jobs-cronjobs.svg index 1aea5e16..6dabdb69 100644 --- a/assets/diagrams/07-jobs-cronjobs.svg +++ b/assets/diagrams/07-jobs-cronjobs.svg @@ -18,5 +18,5 @@ scaled by KEDA image resize, email off the request path -not everything is a request — long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request +not everything is a request: long, batch, or periodic work belongs in Jobs/CronJobs (or a queue worker), never blocking an API request \ No newline at end of file diff --git a/assets/diagrams/07-orchestration-vs-choreography.excalidraw b/assets/diagrams/07-orchestration-vs-choreography.excalidraw index 4717fe83..3c713b2d 100644 --- a/assets/diagrams/07-orchestration-vs-choreography.excalidraw +++ b/assets/diagrams/07-orchestration-vs-choreography.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "orchestration \u2014 a central coordinator commands each step", + "text": "orchestration: a central coordinator commands each step", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "orchestration \u2014 a central coordinator commands each step", + "originalText": "orchestration: a central coordinator commands each step", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "choreography \u2014 each service reacts to the prior event (no central brain)", + "text": "choreography: each service reacts to the prior event (no central brain)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "choreography \u2014 each service reacts to the prior event (no central brain)", + "originalText": "choreography: each service reacts to the prior event (no central brain)", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/07-orchestration-vs-choreography.svg b/assets/diagrams/07-orchestration-vs-choreography.svg index 291e0620..86a2d279 100644 --- a/assets/diagrams/07-orchestration-vs-choreography.svg +++ b/assets/diagrams/07-orchestration-vs-choreography.svg @@ -1,9 +1,9 @@ -orchestration — a central coordinator commands each step +orchestration: a central coordinator commands each step -choreography — each service reacts to the prior event (no central brain) +choreography: each service reacts to the prior event (no central brain) saga orchestrator diff --git a/assets/diagrams/08-contract-lifecycle.excalidraw b/assets/diagrams/08-contract-lifecycle.excalidraw index c14d1445..9ff010f8 100644 --- a/assets/diagrams/08-contract-lifecycle.excalidraw +++ b/assets/diagrams/08-contract-lifecycle.excalidraw @@ -621,13 +621,13 @@ "updated": 1, "link": null, "locked": false, - "text": "every contract moves through one managed lifecycle \u2014 each arrow is an owned transition, not an accident", + "text": "every contract moves through one managed lifecycle: each arrow is an owned transition, not an accident", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "every contract moves through one managed lifecycle \u2014 each arrow is an owned transition, not an accident", + "originalText": "every contract moves through one managed lifecycle: each arrow is an owned transition, not an accident", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/08-contract-lifecycle.svg b/assets/diagrams/08-contract-lifecycle.svg index 98c8f144..15f9eef0 100644 --- a/assets/diagrams/08-contract-lifecycle.svg +++ b/assets/diagrams/08-contract-lifecycle.svg @@ -17,5 +17,5 @@ -every contract moves through one managed lifecycle — each arrow is an owned transition, not an accident +every contract moves through one managed lifecycle: each arrow is an owned transition, not an accident \ No newline at end of file diff --git a/assets/diagrams/08-four-planes.excalidraw b/assets/diagrams/08-four-planes.excalidraw index d7e02724..393c7af9 100644 --- a/assets/diagrams/08-four-planes.excalidraw +++ b/assets/diagrams/08-four-planes.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "API management \u2014 distinct responsibilities, not one monolithic gateway product", + "text": "API management: distinct responsibilities, not one monolithic gateway product", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "API management \u2014 distinct responsibilities, not one monolithic gateway product", + "originalText": "API management: distinct responsibilities, not one monolithic gateway product", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/08-four-planes.svg b/assets/diagrams/08-four-planes.svg index 2d0a71e6..741617c5 100644 --- a/assets/diagrams/08-four-planes.svg +++ b/assets/diagrams/08-four-planes.svg @@ -1,7 +1,7 @@ -API management — distinct responsibilities, not one monolithic gateway product +API management: distinct responsibilities, not one monolithic gateway product Runtime plane gateway + mesh diff --git a/assets/diagrams/10-catalog-payoffs.excalidraw b/assets/diagrams/10-catalog-payoffs.excalidraw index c89659d8..23c614f7 100644 --- a/assets/diagrams/10-catalog-payoffs.excalidraw +++ b/assets/diagrams/10-catalog-payoffs.excalidraw @@ -735,13 +735,13 @@ "updated": 1, "link": null, "locked": false, - "text": "one catalog answers four questions teams otherwise resolve by asking around \u2014 find it, trust it, trace it, and know who owns it", + "text": "one catalog answers four questions teams otherwise resolve by asking around: find it, trust it, trace it, and know who owns it", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "one catalog answers four questions teams otherwise resolve by asking around \u2014 find it, trust it, trace it, and know who owns it", + "originalText": "one catalog answers four questions teams otherwise resolve by asking around: find it, trust it, trace it, and know who owns it", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/10-catalog-payoffs.svg b/assets/diagrams/10-catalog-payoffs.svg index 825e7940..e4481596 100644 --- a/assets/diagrams/10-catalog-payoffs.svg +++ b/assets/diagrams/10-catalog-payoffs.svg @@ -21,5 +21,5 @@ tags + PII classification accountable owner compliance-ready -one catalog answers four questions teams otherwise resolve by asking around — find it, trust it, trace it, and know who owns it +one catalog answers four questions teams otherwise resolve by asking around: find it, trust it, trace it, and know who owns it \ No newline at end of file diff --git a/assets/diagrams/10-metadata-catalog.excalidraw b/assets/diagrams/10-metadata-catalog.excalidraw index 99bbf124..e2c420a1 100644 --- a/assets/diagrams/10-metadata-catalog.excalidraw +++ b/assets/diagrams/10-metadata-catalog.excalidraw @@ -357,13 +357,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Discovery \u2014 search + owner", + "text": "Discovery: search + owner", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Discovery \u2014 search + owner", + "originalText": "Discovery: search + owner", "lineHeight": 1.25, "baseline": 14 }, @@ -420,13 +420,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Trust \u2014 SLOs \u00b7 quality \u00b7 tier", + "text": "Trust: SLOs \u00b7 quality \u00b7 tier", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Trust \u2014 SLOs \u00b7 quality \u00b7 tier", + "originalText": "Trust: SLOs \u00b7 quality \u00b7 tier", "lineHeight": 1.25, "baseline": 14 }, @@ -483,13 +483,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Lineage \u2014 impact analysis", + "text": "Lineage: impact analysis", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Lineage \u2014 impact analysis", + "originalText": "Lineage: impact analysis", "lineHeight": 1.25, "baseline": 14 }, @@ -546,13 +546,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Ownership \u2014 PII \u00b7 owners", + "text": "Ownership: PII \u00b7 owners", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Ownership \u2014 PII \u00b7 owners", + "originalText": "Ownership: PII \u00b7 owners", "lineHeight": 1.25, "baseline": 14 }, @@ -831,13 +831,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the question it answers \u2014 if I change this field, who breaks? \u2014 before you change it", + "text": "the question it answers: if I change this field, who breaks? Before you change it", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the question it answers \u2014 if I change this field, who breaks? \u2014 before you change it", + "originalText": "the question it answers: if I change this field, who breaks? Before you change it", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/10-metadata-catalog.svg b/assets/diagrams/10-metadata-catalog.svg index 4e93591d..9d099951 100644 --- a/assets/diagrams/10-metadata-catalog.svg +++ b/assets/diagrams/10-metadata-catalog.svg @@ -10,13 +10,13 @@ one searchable catalog + automated lineage -Discovery — search + owner +Discovery: search + owner -Trust — SLOs · quality · tier +Trust: SLOs · quality · tier -Lineage — impact analysis +Lineage: impact analysis -Ownership — PII · owners +Ownership: PII · owners ingest ingest @@ -24,5 +24,5 @@ -the question it answers — if I change this field, who breaks? — before you change it +the question it answers: if I change this field, who breaks? Before you change it \ No newline at end of file diff --git a/assets/diagrams/11-sampling.excalidraw b/assets/diagrams/11-sampling.excalidraw index d47abca4..6f1f4dbe 100644 --- a/assets/diagrams/11-sampling.excalidraw +++ b/assets/diagrams/11-sampling.excalidraw @@ -1105,13 +1105,13 @@ "updated": 1, "link": null, "locked": false, - "text": "HEAD sampling \u2014 decide at the START, in the SDK, before the trace completes", + "text": "HEAD sampling: decide at the START, in the SDK, before the trace completes", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "HEAD sampling \u2014 decide at the START, in the SDK, before the trace completes", + "originalText": "HEAD sampling: decide at the START, in the SDK, before the trace completes", "lineHeight": 1.25, "baseline": 12 }, @@ -1140,13 +1140,13 @@ "updated": 1, "link": null, "locked": false, - "text": "TAIL sampling \u2014 decide at the END, in the Collector, after the whole trace is seen", + "text": "TAIL sampling: decide at the END, in the Collector, after the whole trace is seen", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "TAIL sampling \u2014 decide at the END, in the Collector, after the whole trace is seen", + "originalText": "TAIL sampling: decide at the END, in the Collector, after the whole trace is seen", "lineHeight": 1.25, "baseline": 12 }, @@ -1175,13 +1175,13 @@ "updated": 1, "link": null, "locked": false, - "text": "common production: parent-based head baseline + tail sampling to keep every error and slow trace \u2014 always sample by trace, never by span", + "text": "common production: parent-based head baseline + tail sampling to keep every error and slow trace; always sample by trace, never by span", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "common production: parent-based head baseline + tail sampling to keep every error and slow trace \u2014 always sample by trace, never by span", + "originalText": "common production: parent-based head baseline + tail sampling to keep every error and slow trace; always sample by trace, never by span", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/11-sampling.svg b/assets/diagrams/11-sampling.svg index e99e8f21..28074dbc 100644 --- a/assets/diagrams/11-sampling.svg +++ b/assets/diagrams/11-sampling.svg @@ -33,7 +33,7 @@ kept kept -HEAD sampling — decide at the START, in the SDK, before the trace completes -TAIL sampling — decide at the END, in the Collector, after the whole trace is seen -common production: parent-based head baseline + tail sampling to keep every error and slow trace — always sample by trace, never by span +HEAD sampling: decide at the START, in the SDK, before the trace completes +TAIL sampling: decide at the END, in the Collector, after the whole trace is seen +common production: parent-based head baseline + tail sampling to keep every error and slow trace; always sample by trace, never by span \ No newline at end of file diff --git a/assets/diagrams/11-signals-in-depth.excalidraw b/assets/diagrams/11-signals-in-depth.excalidraw index 25faa33f..a1723292 100644 --- a/assets/diagrams/11-signals-in-depth.excalidraw +++ b/assets/diagrams/11-signals-in-depth.excalidraw @@ -1106,13 +1106,13 @@ "updated": 1, "link": null, "locked": false, - "text": "OpenTelemetry is one vendor-neutral SDK for all five \u2014 the trace_id lets you pivot: metric spike \u2192 exemplar trace \u2192 its logs \u2192 its CPU profile", + "text": "OpenTelemetry is one vendor-neutral SDK for all five. The trace_id lets you pivot: metric spike \u2192 exemplar trace \u2192 its logs \u2192 its CPU profile", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "OpenTelemetry is one vendor-neutral SDK for all five \u2014 the trace_id lets you pivot: metric spike \u2192 exemplar trace \u2192 its logs \u2192 its CPU profile", + "originalText": "OpenTelemetry is one vendor-neutral SDK for all five. The trace_id lets you pivot: metric spike \u2192 exemplar trace \u2192 its logs \u2192 its CPU profile", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/11-signals-in-depth.svg b/assets/diagrams/11-signals-in-depth.svg index aeecf3d5..8956dde3 100644 --- a/assets/diagrams/11-signals-in-depth.svg +++ b/assets/diagrams/11-signals-in-depth.svg @@ -32,5 +32,5 @@ Pyroscope / Parca correlated by trace_id + span_id + resource attributes (service.name, k8s.pod, deployment.version) -OpenTelemetry is one vendor-neutral SDK for all five — the trace_id lets you pivot: metric spike → exemplar trace → its logs → its CPU profile +OpenTelemetry is one vendor-neutral SDK for all five. The trace_id lets you pivot: metric spike → exemplar trace → its logs → its CPU profile \ No newline at end of file diff --git a/assets/diagrams/11-three-signals.excalidraw b/assets/diagrams/11-three-signals.excalidraw index 17b2b93f..8fde5f65 100644 --- a/assets/diagrams/11-three-signals.excalidraw +++ b/assets/diagrams/11-three-signals.excalidraw @@ -658,13 +658,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Grafana \u2014 one pane \u00b7 Kiali \u2014 the service-mesh topology view", + "text": "Grafana: one pane \u00b7 Kiali: the service-mesh topology view", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Grafana \u2014 one pane \u00b7 Kiali \u2014 the service-mesh topology view", + "originalText": "Grafana: one pane \u00b7 Kiali: the service-mesh topology view", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/11-three-signals.svg b/assets/diagrams/11-three-signals.svg index c8352772..56e4f6e8 100644 --- a/assets/diagrams/11-three-signals.svg +++ b/assets/diagrams/11-three-signals.svg @@ -19,7 +19,7 @@ Loki filter by trace_id -Grafana — one pane · Kiali — the service-mesh topology view +Grafana: one pane · Kiali: the service-mesh topology view diff --git a/assets/diagrams/11-trace-propagation.excalidraw b/assets/diagrams/11-trace-propagation.excalidraw index b19be59e..ad64584f 100644 --- a/assets/diagrams/11-trace-propagation.excalidraw +++ b/assets/diagrams/11-trace-propagation.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "one trace_id \u2014 constant across every hop (W3C traceparent header)", + "text": "one trace_id: constant across every hop (W3C traceparent header)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "one trace_id \u2014 constant across every hop (W3C traceparent header)", + "originalText": "one trace_id: constant across every hop (W3C traceparent header)", "lineHeight": 1.25, "baseline": 12 }, @@ -647,13 +647,13 @@ "updated": 1, "link": null, "locked": false, - "text": "five services, one readable waterfall \u2014 you can see which span dominated the latency", + "text": "five services, one readable waterfall: you can see which span dominated the latency", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "five services, one readable waterfall \u2014 you can see which span dominated the latency", + "originalText": "five services, one readable waterfall: you can see which span dominated the latency", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/11-trace-propagation.svg b/assets/diagrams/11-trace-propagation.svg index 5e7d2906..458fa7fb 100644 --- a/assets/diagrams/11-trace-propagation.svg +++ b/assets/diagrams/11-trace-propagation.svg @@ -1,7 +1,7 @@ -one trace_id — constant across every hop (W3C traceparent header) +one trace_id: constant across every hop (W3C traceparent header) order-service POST /orders span @@ -19,5 +19,5 @@ traceparent -five services, one readable waterfall — you can see which span dominated the latency +five services, one readable waterfall: you can see which span dominated the latency \ No newline at end of file diff --git a/assets/diagrams/11-trace-stitch.excalidraw b/assets/diagrams/11-trace-stitch.excalidraw index 6b6dfd31..7668cf9f 100644 --- a/assets/diagrams/11-trace-stitch.excalidraw +++ b/assets/diagrams/11-trace-stitch.excalidraw @@ -358,13 +358,13 @@ "updated": 1, "link": null, "locked": false, - "text": "trace_id = 4af9c\u2026 shared by every span, metric exemplar, and log line \u2014 context propagation turns five services' logs into one readable story", + "text": "trace_id = 4af9c\u2026 shared by every span, metric exemplar, and log line: context propagation turns five services' logs into one readable story", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "trace_id = 4af9c\u2026 shared by every span, metric exemplar, and log line \u2014 context propagation turns five services' logs into one readable story", + "originalText": "trace_id = 4af9c\u2026 shared by every span, metric exemplar, and log line: context propagation turns five services' logs into one readable story", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/11-trace-stitch.svg b/assets/diagrams/11-trace-stitch.svg index 9a4cbe63..8249cfd1 100644 --- a/assets/diagrams/11-trace-stitch.svg +++ b/assets/diagrams/11-trace-stitch.svg @@ -10,5 +10,5 @@ consume → notify time → -trace_id = 4af9c… shared by every span, metric exemplar, and log line — context propagation turns five services' logs into one readable story +trace_id = 4af9c… shared by every span, metric exemplar, and log line: context propagation turns five services' logs into one readable story \ No newline at end of file diff --git a/assets/diagrams/12-bulkhead.excalidraw b/assets/diagrams/12-bulkhead.excalidraw index fa397787..7ba52a0b 100644 --- a/assets/diagrams/12-bulkhead.excalidraw +++ b/assets/diagrams/12-bulkhead.excalidraw @@ -973,13 +973,13 @@ "updated": 1, "link": null, "locked": false, - "text": "watertight compartments from naval architecture \u2014 per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools)", + "text": "watertight compartments from naval architecture: per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "watertight compartments from naval architecture \u2014 per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools)", + "originalText": "watertight compartments from naval architecture: per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools)", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-bulkhead.svg b/assets/diagrams/12-bulkhead.svg index 0e0c6ee5..fd05d5f5 100644 --- a/assets/diagrams/12-bulkhead.svg +++ b/assets/diagrams/12-bulkhead.svg @@ -28,5 +28,5 @@ blast radius bounded Without bulkheads With bulkheads -watertight compartments from naval architecture — per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools) +watertight compartments from naval architecture: per-tenant connection pools, per-call thread groups, semaphore-bounded operations (Resilience4j, Polly, Istio per-destination pools) \ No newline at end of file diff --git a/assets/diagrams/12-claim-check.excalidraw b/assets/diagrams/12-claim-check.excalidraw index dc9e4b13..38521a2a 100644 --- a/assets/diagrams/12-claim-check.excalidraw +++ b/assets/diagrams/12-claim-check.excalidraw @@ -732,13 +732,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the broker holds only the claim (URI + signed token) \u2014 PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke", + "text": "the broker holds only the claim (URI + signed token): PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the broker holds only the claim (URI + signed token) \u2014 PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke", + "originalText": "the broker holds only the claim (URI + signed token): PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-claim-check.svg b/assets/diagrams/12-claim-check.svg index af4f3875..9c34a073 100644 --- a/assets/diagrams/12-claim-check.svg +++ b/assets/diagrams/12-claim-check.svg @@ -24,5 +24,5 @@ 4. FETCH payload (with token) 4. FETCH payload (with token) -the broker holds only the claim (URI + signed token) — PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke +the broker holds only the claim (URI + signed token): PII never crosses Kafka's wire or sits in topic retention; the token can expire and the store can revoke \ No newline at end of file diff --git a/assets/diagrams/12-four-cs.excalidraw b/assets/diagrams/12-four-cs.excalidraw index 30084dba..85f0c5a5 100644 --- a/assets/diagrams/12-four-cs.excalidraw +++ b/assets/diagrams/12-four-cs.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Cloud \u00b7 IAM \u00b7 VPC \u00b7 KMS \u00b7 audit logs \u2014 platform / cloud admin", + "text": "Cloud \u00b7 IAM \u00b7 VPC \u00b7 KMS \u00b7 audit logs: platform / cloud admin", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Cloud \u00b7 IAM \u00b7 VPC \u00b7 KMS \u00b7 audit logs \u2014 platform / cloud admin", + "originalText": "Cloud \u00b7 IAM \u00b7 VPC \u00b7 KMS \u00b7 audit logs: platform / cloud admin", "lineHeight": 1.25, "baseline": 12 }, @@ -280,13 +280,13 @@ "updated": 1, "link": null, "locked": false, - "text": "concentric layers \u2014 each protects what is inside it; a breach of one is contained by the next", + "text": "concentric layers: each protects what is inside it; a breach of one is contained by the next", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "concentric layers \u2014 each protects what is inside it; a breach of one is contained by the next", + "originalText": "concentric layers: each protects what is inside it; a breach of one is contained by the next", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/12-four-cs.svg b/assets/diagrams/12-four-cs.svg index 60c84f8c..30b28b6a 100644 --- a/assets/diagrams/12-four-cs.svg +++ b/assets/diagrams/12-four-cs.svg @@ -1,12 +1,12 @@ -Cloud · IAM · VPC · KMS · audit logs — platform / cloud admin +Cloud · IAM · VPC · KMS · audit logs: platform / cloud admin Cluster · RBAC · NetworkPolicy · Pod Security · admission Container · minimal image · non-root · read-only FS · signed Code · authz · input validation · secrets · deps -concentric layers — each protects what is inside it; a breach of one is contained by the next +concentric layers: each protects what is inside it; a breach of one is contained by the next \ No newline at end of file diff --git a/assets/diagrams/12-policy-as-code.excalidraw b/assets/diagrams/12-policy-as-code.excalidraw index 43db9464..a92bf260 100644 --- a/assets/diagrams/12-policy-as-code.excalidraw +++ b/assets/diagrams/12-policy-as-code.excalidraw @@ -1041,13 +1041,13 @@ "updated": 1, "link": null, "locked": false, - "text": "policy lives in Git, reviewed like code, applied by the cluster \u2014 no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape)", + "text": "policy lives in Git, reviewed like code, applied by the cluster: no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "policy lives in Git, reviewed like code, applied by the cluster \u2014 no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape)", + "originalText": "policy lives in Git, reviewed like code, applied by the cluster: no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape)", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-policy-as-code.svg b/assets/diagrams/12-policy-as-code.svg index 6769bb7d..70490ce2 100644 --- a/assets/diagrams/12-policy-as-code.svg +++ b/assets/diagrams/12-policy-as-code.svg @@ -30,5 +30,5 @@ loaded loaded -policy lives in Git, reviewed like code, applied by the cluster — no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape) +policy lives in Git, reviewed like code, applied by the cluster: no human runs a checklist (OPA/Gatekeeper, Kyverno, Conftest, Kubescape) \ No newline at end of file diff --git a/assets/diagrams/12-sidecar.excalidraw b/assets/diagrams/12-sidecar.excalidraw index 345dd4d5..28b6ad84 100644 --- a/assets/diagrams/12-sidecar.excalidraw +++ b/assets/diagrams/12-sidecar.excalidraw @@ -927,13 +927,13 @@ "updated": 1, "link": null, "locked": false, - "text": "same security policy across every workload, in any language \u2014 the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto", + "text": "same security policy across every workload, in any language: the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "same security policy across every workload, in any language \u2014 the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto", + "originalText": "same security policy across every workload, in any language: the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-sidecar.svg b/assets/diagrams/12-sidecar.svg index c4d301c3..53a7e299 100644 --- a/assets/diagrams/12-sidecar.svg +++ b/assets/diagrams/12-sidecar.svg @@ -27,5 +27,5 @@ localhost localhost -same security policy across every workload, in any language — the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto +same security policy across every workload, in any language: the app trusts the sidecar's headers (X-Forwarded-Client-Cert, JWT claims); teams write business code, not crypto \ No newline at end of file diff --git a/assets/diagrams/12-valet-key.excalidraw b/assets/diagrams/12-valet-key.excalidraw index b47db9b5..a60e844a 100644 --- a/assets/diagrams/12-valet-key.excalidraw +++ b/assets/diagrams/12-valet-key.excalidraw @@ -357,13 +357,13 @@ "updated": 1, "link": null, "locked": false, - "text": "directly \u2014 no app hop", + "text": "directly: no app hop", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "directly \u2014 no app hop", + "originalText": "directly: no app hop", "lineHeight": 1.25, "baseline": 11 }, @@ -872,13 +872,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the app never proxies the bytes \u2014 no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself)", + "text": "the app never proxies the bytes: no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the app never proxies the bytes \u2014 no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself)", + "originalText": "the app never proxies the bytes: no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself)", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-valet-key.svg b/assets/diagrams/12-valet-key.svg index 962fcc2d..f73c0596 100644 --- a/assets/diagrams/12-valet-key.svg +++ b/assets/diagrams/12-valet-key.svg @@ -10,7 +10,7 @@ Resource (object store, file) client uploads / downloads -directly — no app hop +directly: no app hop Storage / KMS validates the token, @@ -28,5 +28,5 @@ 4. validate 4. validate -the app never proxies the bytes — no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself) +the app never proxies the bytes: no long-lived credentials at the client (Example 12: a ticket the service signs and verifies itself) \ No newline at end of file diff --git a/assets/diagrams/12-zero-trust.excalidraw b/assets/diagrams/12-zero-trust.excalidraw index 08767aac..b12d4d77 100644 --- a/assets/diagrams/12-zero-trust.excalidraw +++ b/assets/diagrams/12-zero-trust.excalidraw @@ -1077,13 +1077,13 @@ "updated": 1, "link": null, "locked": false, - "text": "mTLS + SPIFFE identity inside the cluster \u00b7 IAP at the edge \u00b7 AuthorizationPolicy per workload \u2014 a breach in one service buys nothing", + "text": "mTLS + SPIFFE identity inside the cluster \u00b7 IAP at the edge \u00b7 AuthorizationPolicy per workload: a breach in one service buys nothing", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "mTLS + SPIFFE identity inside the cluster \u00b7 IAP at the edge \u00b7 AuthorizationPolicy per workload \u2014 a breach in one service buys nothing", + "originalText": "mTLS + SPIFFE identity inside the cluster \u00b7 IAP at the edge \u00b7 AuthorizationPolicy per workload: a breach in one service buys nothing", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/12-zero-trust.svg b/assets/diagrams/12-zero-trust.svg index bb7a98ce..d8f1dcad 100644 --- a/assets/diagrams/12-zero-trust.svg +++ b/assets/diagrams/12-zero-trust.svg @@ -31,5 +31,5 @@ Old model (perimeter trust) in once → trusted forever → lateral movement is trivial Zero-trust model -mTLS + SPIFFE identity inside the cluster · IAP at the edge · AuthorizationPolicy per workload — a breach in one service buys nothing +mTLS + SPIFFE identity inside the cluster · IAP at the edge · AuthorizationPolicy per workload: a breach in one service buys nothing \ No newline at end of file diff --git a/assets/diagrams/13-antipattern-heuristics.excalidraw b/assets/diagrams/13-antipattern-heuristics.excalidraw index 63a57920..6deede82 100644 --- a/assets/diagrams/13-antipattern-heuristics.excalidraw +++ b/assets/diagrams/13-antipattern-heuristics.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Distributed monolith \u2014 deploy together", + "text": "Distributed monolith: deploy together", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Distributed monolith \u2014 deploy together", + "originalText": "Distributed monolith: deploy together", "lineHeight": 1.25, "baseline": 14 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Shared database \u2014 two services, one table", + "text": "Shared database: two services, one table", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Shared database \u2014 two services, one table", + "originalText": "Shared database: two services, one table", "lineHeight": 1.25, "baseline": 14 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Chatty call chains \u2014 deep sync hops", + "text": "Chatty call chains: deep sync hops", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Chatty call chains \u2014 deep sync hops", + "originalText": "Chatty call chains: deep sync hops", "lineHeight": 1.25, "baseline": 14 }, @@ -873,13 +873,13 @@ "updated": 1, "link": null, "locked": false, - "text": "anti-pattern \u2014 coupling sneaking back in", + "text": "anti-pattern: coupling sneaking back in", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "anti-pattern \u2014 coupling sneaking back in", + "originalText": "anti-pattern: coupling sneaking back in", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/13-antipattern-heuristics.svg b/assets/diagrams/13-antipattern-heuristics.svg index 0adc5e39..4794cd32 100644 --- a/assets/diagrams/13-antipattern-heuristics.svg +++ b/assets/diagrams/13-antipattern-heuristics.svg @@ -1,11 +1,11 @@ -Distributed monolith — deploy together +Distributed monolith: deploy together -Shared database — two services, one table +Shared database: two services, one table -Chatty call chains — deep sync hops +Chatty call chains: deep sync hops No contract · leaky internal models @@ -25,6 +25,6 @@ -anti-pattern — coupling sneaking back in +anti-pattern: coupling sneaking back in the PR-review test that catches it \ No newline at end of file diff --git a/assets/diagrams/13-antipatterns-grid.excalidraw b/assets/diagrams/13-antipatterns-grid.excalidraw index caf01869..8e0113b4 100644 --- a/assets/diagrams/13-antipatterns-grid.excalidraw +++ b/assets/diagrams/13-antipatterns-grid.excalidraw @@ -224,13 +224,13 @@ "updated": 1, "link": null, "locked": false, - "text": "two services, one schema \u2014", + "text": "two services, one schema :", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "two services, one schema \u2014", + "originalText": "two services, one schema :", "lineHeight": 1.25, "baseline": 11 }, @@ -1225,13 +1225,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each one re-couples what the architecture worked to separate \u2014 most outages trace back to one of these", + "text": "each one re-couples what the architecture worked to separate: most outages trace back to one of these", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each one re-couples what the architecture worked to separate \u2014 most outages trace back to one of these", + "originalText": "each one re-couples what the architecture worked to separate: most outages trace back to one of these", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/13-antipatterns-grid.svg b/assets/diagrams/13-antipatterns-grid.svg index 610a78f9..734f7e9a 100644 --- a/assets/diagrams/13-antipatterns-grid.svg +++ b/assets/diagrams/13-antipatterns-grid.svg @@ -6,7 +6,7 @@ one change ripples everywhere Shared database -two services, one schema — +two services, one schema : coupled deploys and blast radius Chatty / N+1 APIs @@ -36,5 +36,5 @@ Leaky internal models DB rows exposed as the public API; can't evolve -each one re-couples what the architecture worked to separate — most outages trace back to one of these +each one re-couples what the architecture worked to separate: most outages trace back to one of these \ No newline at end of file diff --git a/assets/diagrams/14-protocol-roundtrips.excalidraw b/assets/diagrams/14-protocol-roundtrips.excalidraw index 2834af21..46b73341 100644 --- a/assets/diagrams/14-protocol-roundtrips.excalidraw +++ b/assets/diagrams/14-protocol-roundtrips.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "REST \u2014 several round trips, fixed payloads (over/under-fetch)", + "text": "REST: several round trips, fixed payloads (over/under-fetch)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "REST \u2014 several round trips, fixed payloads (over/under-fetch)", + "originalText": "REST: several round trips, fixed payloads (over/under-fetch)", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "GraphQL \u2014 one query, the client names the fields", + "text": "GraphQL: one query, the client names the fields", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "GraphQL \u2014 one query, the client names the fields", + "originalText": "GraphQL: one query, the client names the fields", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/14-protocol-roundtrips.svg b/assets/diagrams/14-protocol-roundtrips.svg index eecc4ad7..b0d0b7e5 100644 --- a/assets/diagrams/14-protocol-roundtrips.svg +++ b/assets/diagrams/14-protocol-roundtrips.svg @@ -1,9 +1,9 @@ -REST — several round trips, fixed payloads (over/under-fetch) +REST: several round trips, fixed payloads (over/under-fetch) -GraphQL — one query, the client names the fields +GraphQL: one query, the client names the fields client diff --git a/assets/diagrams/14-streaming-modes.excalidraw b/assets/diagrams/14-streaming-modes.excalidraw index 172ea528..221c2086 100644 --- a/assets/diagrams/14-streaming-modes.excalidraw +++ b/assets/diagrams/14-streaming-modes.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Unary \u2014 one request, one response", + "text": "Unary: one request, one response", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Unary \u2014 one request, one response", + "originalText": "Unary: one request, one response", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Server-streaming \u2014 one request, N responses", + "text": "Server-streaming: one request, N responses", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Server-streaming \u2014 one request, N responses", + "originalText": "Server-streaming: one request, N responses", "lineHeight": 1.25, "baseline": 12 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Client-streaming \u2014 N requests, one response", + "text": "Client-streaming: N requests, one response", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Client-streaming \u2014 N requests, one response", + "originalText": "Client-streaming: N requests, one response", "lineHeight": 1.25, "baseline": 12 }, @@ -245,13 +245,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Bidirectional \u2014 both stream independently", + "text": "Bidirectional: both stream independently", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Bidirectional \u2014 both stream independently", + "originalText": "Bidirectional: both stream independently", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/14-streaming-modes.svg b/assets/diagrams/14-streaming-modes.svg index 296337fd..f6e44af7 100644 --- a/assets/diagrams/14-streaming-modes.svg +++ b/assets/diagrams/14-streaming-modes.svg @@ -1,13 +1,13 @@ -Unary — one request, one response +Unary: one request, one response -Server-streaming — one request, N responses +Server-streaming: one request, N responses -Client-streaming — N requests, one response +Client-streaming: N requests, one response -Bidirectional — both stream independently +Bidirectional: both stream independently Client diff --git a/assets/diagrams/14-three-paradigms.excalidraw b/assets/diagrams/14-three-paradigms.excalidraw index cbfc5aad..58bc3c1b 100644 --- a/assets/diagrams/14-three-paradigms.excalidraw +++ b/assets/diagrams/14-three-paradigms.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "REST \u2014 resources", + "text": "REST: resources", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "REST \u2014 resources", + "originalText": "REST: resources", "lineHeight": 1.25, "baseline": 14 }, @@ -329,13 +329,13 @@ "updated": 1, "link": null, "locked": false, - "text": "gRPC \u2014 procedures", + "text": "gRPC: procedures", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "gRPC \u2014 procedures", + "originalText": "gRPC: procedures", "lineHeight": 1.25, "baseline": 14 }, @@ -602,13 +602,13 @@ "updated": 1, "link": null, "locked": false, - "text": "GraphQL \u2014 a graph", + "text": "GraphQL: a graph", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "GraphQL \u2014 a graph", + "originalText": "GraphQL: a graph", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/14-three-paradigms.svg b/assets/diagrams/14-three-paradigms.svg index c2368c16..1e3140ba 100644 --- a/assets/diagrams/14-three-paradigms.svg +++ b/assets/diagrams/14-three-paradigms.svg @@ -1,7 +1,7 @@ -REST — resources +REST: resources nouns + HTTP verbs POST /orders @@ -9,7 +9,7 @@ state transfer server defines payload -gRPC — procedures +gRPC: procedures typed method calls Order.Place(req) @@ -17,7 +17,7 @@ behaviour, not state contract = .proto -GraphQL — a graph +GraphQL: a graph one typed schema query { order { ... } } diff --git a/assets/diagrams/15-deprecation-lifecycle.excalidraw b/assets/diagrams/15-deprecation-lifecycle.excalidraw index c2612483..bb0bec9b 100644 --- a/assets/diagrams/15-deprecation-lifecycle.excalidraw +++ b/assets/diagrams/15-deprecation-lifecycle.excalidraw @@ -91,13 +91,13 @@ "updated": 1, "link": null, "locked": false, - "text": "additive \u2014 always safe", + "text": "additive: always safe", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "additive \u2014 always safe", + "originalText": "additive: always safe", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/15-deprecation-lifecycle.svg b/assets/diagrams/15-deprecation-lifecycle.svg index 4f52fcd7..9b513658 100644 --- a/assets/diagrams/15-deprecation-lifecycle.svg +++ b/assets/diagrams/15-deprecation-lifecycle.svg @@ -2,7 +2,7 @@ ADD -additive — always safe +additive: always safe DEPRECATE reason · replacement · sunset diff --git a/assets/diagrams/15-grpc-breaking.excalidraw b/assets/diagrams/15-grpc-breaking.excalidraw index b290b393..a0f75e37 100644 --- a/assets/diagrams/15-grpc-breaking.excalidraw +++ b/assets/diagrams/15-grpc-breaking.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Safe \u2014 wire compatible", + "text": "Safe: wire compatible", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Safe \u2014 wire compatible", + "originalText": "Safe: wire compatible", "lineHeight": 1.25, "baseline": 14 }, @@ -329,13 +329,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Breaking \u2014 rejected by the gate", + "text": "Breaking: rejected by the gate", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Breaking \u2014 rejected by the gate", + "originalText": "Breaking: rejected by the gate", "lineHeight": 1.25, "baseline": 14 }, @@ -574,13 +574,13 @@ "updated": 1, "link": null, "locked": false, - "text": "switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing \u2014 always breaking", + "text": "switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing: always breaking", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing \u2014 always breaking", + "originalText": "switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing: always breaking", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/15-grpc-breaking.svg b/assets/diagrams/15-grpc-breaking.svg index b355cd7b..2fa0e1f1 100644 --- a/assets/diagrams/15-grpc-breaking.svg +++ b/assets/diagrams/15-grpc-breaking.svg @@ -1,7 +1,7 @@ -Safe — wire compatible +Safe: wire compatible add a field with a new number add a new rpc method add a value to an enum @@ -9,13 +9,13 @@ deprecate with [deprecated=true] widen with reserved for old tags -Breaking — rejected by the gate +Breaking: rejected by the gate change a field's number or type reuse a removed field number remove a field without reserved change unary ↔ streaming on an rpc rename or move a service / package change request / response message type -switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing — always breaking +switching a method between unary, server-stream, client-stream or bidi changes the HTTP/2 framing: always breaking wire compatibility is governed by field numbers and types; never reuse or renumber a field \ No newline at end of file diff --git a/assets/diagrams/16-ws-backplane.excalidraw b/assets/diagrams/16-ws-backplane.excalidraw index da561202..52289e88 100644 --- a/assets/diagrams/16-ws-backplane.excalidraw +++ b/assets/diagrams/16-ws-backplane.excalidraw @@ -549,13 +549,13 @@ "updated": 1, "link": null, "locked": false, - "text": "no pod is special \u2014 the backplane fans each message to whichever pod holds the client", + "text": "no pod is special: the backplane fans each message to whichever pod holds the client", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "no pod is special \u2014 the backplane fans each message to whichever pod holds the client", + "originalText": "no pod is special: the backplane fans each message to whichever pod holds the client", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/16-ws-backplane.svg b/assets/diagrams/16-ws-backplane.svg index 84af9e74..6d05a045 100644 --- a/assets/diagrams/16-ws-backplane.svg +++ b/assets/diagrams/16-ws-backplane.svg @@ -18,5 +18,5 @@ sub sub -no pod is special — the backplane fans each message to whichever pod holds the client +no pod is special: the backplane fans each message to whichever pod holds the client \ No newline at end of file diff --git a/assets/diagrams/16-ws-protobuf-envelope.excalidraw b/assets/diagrams/16-ws-protobuf-envelope.excalidraw index 5fe56e6d..d7e73557 100644 --- a/assets/diagrams/16-ws-protobuf-envelope.excalidraw +++ b/assets/diagrams/16-ws-protobuf-envelope.excalidraw @@ -765,13 +765,13 @@ "updated": 1, "link": null, "locked": false, - "text": "versioned by field number (like gRPC) \u2014 add fields, never renumber", + "text": "versioned by field number (like gRPC): add fields, never renumber", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "versioned by field number (like gRPC) \u2014 add fields, never renumber", + "originalText": "versioned by field number (like gRPC): add fields, never renumber", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/16-ws-protobuf-envelope.svg b/assets/diagrams/16-ws-protobuf-envelope.svg index e86c3e64..ca5fbe59 100644 --- a/assets/diagrams/16-ws-protobuf-envelope.svg +++ b/assets/diagrams/16-ws-protobuf-envelope.svg @@ -22,5 +22,5 @@ decode → dispatch -versioned by field number (like gRPC) — add fields, never renumber +versioned by field number (like gRPC): add fields, never renumber \ No newline at end of file diff --git a/assets/diagrams/16-ws-resume.excalidraw b/assets/diagrams/16-ws-resume.excalidraw index 13259d76..f9199fb4 100644 --- a/assets/diagrams/16-ws-resume.excalidraw +++ b/assets/diagrams/16-ws-resume.excalidraw @@ -673,13 +673,13 @@ "updated": 1, "link": null, "locked": false, - "text": "live again \u2014 at-least-once, deduped by seq", + "text": "live again: at-least-once, deduped by seq", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "live again \u2014 at-least-once, deduped by seq", + "originalText": "live again: at-least-once, deduped by seq", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/16-ws-resume.svg b/assets/diagrams/16-ws-resume.svg index 1ff004d9..36293fcf 100644 --- a/assets/diagrams/16-ws-resume.svg +++ b/assets/diagrams/16-ws-resume.svg @@ -22,7 +22,7 @@ replay events 1043…1050 (idempotent) replay events 1043…1050 (idempotent) -live again — at-least-once, deduped by seq -live again — at-least-once, deduped by seq +live again: at-least-once, deduped by seq +live again: at-least-once, deduped by seq treat every connection as disposable: detect, reconnect with backoff, resume from the last acknowledged sequence \ No newline at end of file diff --git a/assets/diagrams/16-ws-scaling-problem.excalidraw b/assets/diagrams/16-ws-scaling-problem.excalidraw index 90707a39..a89fb87f 100644 --- a/assets/diagrams/16-ws-scaling-problem.excalidraw +++ b/assets/diagrams/16-ws-scaling-problem.excalidraw @@ -651,13 +651,13 @@ "updated": 1, "link": null, "locked": false, - "text": "connections \u2014 only new ones", + "text": "connections: only new ones", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "connections \u2014 only new ones", + "originalText": "connections: only new ones", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/16-ws-scaling-problem.svg b/assets/diagrams/16-ws-scaling-problem.svg index 662cdde9..bdf29fc7 100644 --- a/assets/diagrams/16-ws-scaling-problem.svg +++ b/assets/diagrams/16-ws-scaling-problem.svg @@ -19,7 +19,7 @@ scale-up problem new pod gets no existing -connections — only new ones +connections: only new ones scale-down / rollout killing a pod drops every diff --git a/assets/diagrams/17-saga-compensation.excalidraw b/assets/diagrams/17-saga-compensation.excalidraw index 851c8dce..a3ccc7b1 100644 --- a/assets/diagrams/17-saga-compensation.excalidraw +++ b/assets/diagrams/17-saga-compensation.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "forward \u2014 each step commits in its own service", + "text": "forward: each step commits in its own service", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "forward \u2014 each step commits in its own service", + "originalText": "forward: each step commits in its own service", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "compensate \u2014 semantic inverse, reverse order, only completed steps", + "text": "compensate: semantic inverse, reverse order, only completed steps", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "compensate \u2014 semantic inverse, reverse order, only completed steps", + "originalText": "compensate: semantic inverse, reverse order, only completed steps", "lineHeight": 1.25, "baseline": 12 }, @@ -711,13 +711,13 @@ "updated": 1, "link": null, "locked": false, - "text": "no cross-service rollback exists \u2014 you run defined inverses, newest first", + "text": "no cross-service rollback exists: you run defined inverses, newest first", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "no cross-service rollback exists \u2014 you run defined inverses, newest first", + "originalText": "no cross-service rollback exists: you run defined inverses, newest first", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/17-saga-compensation.svg b/assets/diagrams/17-saga-compensation.svg index 3e09c46d..1e38cad8 100644 --- a/assets/diagrams/17-saga-compensation.svg +++ b/assets/diagrams/17-saga-compensation.svg @@ -1,9 +1,9 @@ -forward — each step commits in its own service +forward: each step commits in its own service -compensate — semantic inverse, reverse order, only completed steps +compensate: semantic inverse, reverse order, only completed steps charge_payment @@ -22,5 +22,5 @@ reverse order reverse order -no cross-service rollback exists — you run defined inverses, newest first +no cross-service rollback exists: you run defined inverses, newest first \ No newline at end of file diff --git a/assets/diagrams/17-saga-context.excalidraw b/assets/diagrams/17-saga-context.excalidraw index 42dab1bf..bf63516a 100644 --- a/assets/diagrams/17-saga-context.excalidraw +++ b/assets/diagrams/17-saga-context.excalidraw @@ -588,13 +588,13 @@ "updated": 1, "link": null, "locked": false, - "text": "done, and resume at step B \u2014 no re-call of A, no lost data", + "text": "done, and resume at step B: no re-call of A, no lost data", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "done, and resume at step B \u2014 no re-call of A, no lost data", + "originalText": "done, and resume at step B: no re-call of A, no lost data", "lineHeight": 1.25, "baseline": 11 }, @@ -935,13 +935,13 @@ "updated": 1, "link": null, "locked": false, - "text": "don't make B call A \u2014 persist A's result into the saga context and pass it forward; on resume, read it back", + "text": "don't make B call A: persist A's result into the saga context and pass it forward; on resume, read it back", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "don't make B call A \u2014 persist A's result into the saga context and pass it forward; on resume, read it back", + "originalText": "don't make B call A: persist A's result into the saga context and pass it forward; on resume, read it back", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/17-saga-context.svg b/assets/diagrams/17-saga-context.svg index 58588965..acb2e257 100644 --- a/assets/diagrams/17-saga-context.svg +++ b/assets/diagrams/17-saga-context.svg @@ -17,7 +17,7 @@ written after A, read before B crash between 2 and 3? on restart, load the saga context, see A is -done, and resume at step B — no re-call of A, no lost data +done, and resume at step B: no re-call of A, no lost data 1. call A 1. call A @@ -30,5 +30,5 @@ 3. call B(ctx) 3. call B(ctx) -don't make B call A — persist A's result into the saga context and pass it forward; on resume, read it back +don't make B call A: persist A's result into the saga context and pass it forward; on resume, read it back \ No newline at end of file diff --git a/assets/diagrams/18-graphql-errors.excalidraw b/assets/diagrams/18-graphql-errors.excalidraw index b560464f..76321a89 100644 --- a/assets/diagrams/18-graphql-errors.excalidraw +++ b/assets/diagrams/18-graphql-errors.excalidraw @@ -609,13 +609,13 @@ "updated": 1, "link": null, "locked": false, - "text": "return the data you have, null the field that failed, and put a machine code in extensions \u2014 don't blanket-fail a whole query", + "text": "return the data you have, null the field that failed, and put a machine code in extensions: don't blanket-fail a whole query", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "return the data you have, null the field that failed, and put a machine code in extensions \u2014 don't blanket-fail a whole query", + "originalText": "return the data you have, null the field that failed, and put a machine code in extensions: don't blanket-fail a whole query", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/18-graphql-errors.svg b/assets/diagrams/18-graphql-errors.svg index 31c8b903..692abb5b 100644 --- a/assets/diagrams/18-graphql-errors.svg +++ b/assets/diagrams/18-graphql-errors.svg @@ -17,5 +17,5 @@ code: UNAVAILABLE retryable: true traceId: 4af9c… -return the data you have, null the field that failed, and put a machine code in extensions — don't blanket-fail a whole query +return the data you have, null the field that failed, and put a machine code in extensions: don't blanket-fail a whole query \ No newline at end of file diff --git a/assets/diagrams/18-grpc-errors.excalidraw b/assets/diagrams/18-grpc-errors.excalidraw index 51587b5c..69e905f7 100644 --- a/assets/diagrams/18-grpc-errors.excalidraw +++ b/assets/diagrams/18-grpc-errors.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "INVALID_ARGUMENT \u00b7 NOT_FOUND \u2014 client bug, don't retry", + "text": "INVALID_ARGUMENT \u00b7 NOT_FOUND: client bug, don't retry", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "INVALID_ARGUMENT \u00b7 NOT_FOUND \u2014 client bug, don't retry", + "originalText": "INVALID_ARGUMENT \u00b7 NOT_FOUND: client bug, don't retry", "lineHeight": 1.25, "baseline": 14 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "FAILED_PRECONDITION \u00b7 ALREADY_EXISTS \u2014 state, don't retry", + "text": "FAILED_PRECONDITION \u00b7 ALREADY_EXISTS: state, don't retry", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "FAILED_PRECONDITION \u00b7 ALREADY_EXISTS \u2014 state, don't retry", + "originalText": "FAILED_PRECONDITION \u00b7 ALREADY_EXISTS: state, don't retry", "lineHeight": 1.25, "baseline": 14 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "UNAVAILABLE \u00b7 ABORTED \u2014 transient, retry with backoff", + "text": "UNAVAILABLE \u00b7 ABORTED: transient, retry with backoff", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "UNAVAILABLE \u00b7 ABORTED \u2014 transient, retry with backoff", + "originalText": "UNAVAILABLE \u00b7 ABORTED: transient, retry with backoff", "lineHeight": 1.25, "baseline": 14 }, @@ -245,13 +245,13 @@ "updated": 1, "link": null, "locked": false, - "text": "RESOURCE_EXHAUSTED \u2014 honour the RetryInfo delay", + "text": "RESOURCE_EXHAUSTED: honour the RetryInfo delay", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "RESOURCE_EXHAUSTED \u2014 honour the RetryInfo delay", + "originalText": "RESOURCE_EXHAUSTED: honour the RetryInfo delay", "lineHeight": 1.25, "baseline": 14 }, @@ -308,13 +308,13 @@ "updated": 1, "link": null, "locked": false, - "text": "DEADLINE_EXCEEDED \u2014 tune the timeout; maybe retry", + "text": "DEADLINE_EXCEEDED: tune the timeout; maybe retry", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "DEADLINE_EXCEEDED \u2014 tune the timeout; maybe retry", + "originalText": "DEADLINE_EXCEEDED: tune the timeout; maybe retry", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/18-grpc-errors.svg b/assets/diagrams/18-grpc-errors.svg index 9d9c3b3a..2868565d 100644 --- a/assets/diagrams/18-grpc-errors.svg +++ b/assets/diagrams/18-grpc-errors.svg @@ -1,15 +1,15 @@ -INVALID_ARGUMENT · NOT_FOUND — client bug, don't retry +INVALID_ARGUMENT · NOT_FOUND: client bug, don't retry -FAILED_PRECONDITION · ALREADY_EXISTS — state, don't retry +FAILED_PRECONDITION · ALREADY_EXISTS: state, don't retry -UNAVAILABLE · ABORTED — transient, retry with backoff +UNAVAILABLE · ABORTED: transient, retry with backoff -RESOURCE_EXHAUSTED — honour the RetryInfo delay +RESOURCE_EXHAUSTED: honour the RetryInfo delay -DEADLINE_EXCEEDED — tune the timeout; maybe retry +DEADLINE_EXCEEDED: tune the timeout; maybe retry google.rpc.Status (in trailers) diff --git a/assets/diagrams/18-kafka-dlq.excalidraw b/assets/diagrams/18-kafka-dlq.excalidraw index 5154a4d1..10232823 100644 --- a/assets/diagrams/18-kafka-dlq.excalidraw +++ b/assets/diagrams/18-kafka-dlq.excalidraw @@ -1147,13 +1147,13 @@ "updated": 1, "link": null, "locked": false, - "text": "commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts \u2014 the main stream never stalls", + "text": "commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts: the main stream never stalls", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts \u2014 the main stream never stalls", + "originalText": "commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts: the main stream never stalls", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/18-kafka-dlq.svg b/assets/diagrams/18-kafka-dlq.svg index 3722a30c..8c449576 100644 --- a/assets/diagrams/18-kafka-dlq.svg +++ b/assets/diagrams/18-kafka-dlq.svg @@ -35,5 +35,5 @@ after N tries after N tries -commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts — the main stream never stalls +commit the offset, route the failed record to delayed-retry topics, then to a DLQ after N attempts: the main stream never stalls \ No newline at end of file diff --git a/assets/diagrams/18-one-error-model.excalidraw b/assets/diagrams/18-one-error-model.excalidraw index e81623c3..42dd60fa 100644 --- a/assets/diagrams/18-one-error-model.excalidraw +++ b/assets/diagrams/18-one-error-model.excalidraw @@ -970,13 +970,13 @@ "updated": 1, "link": null, "locked": false, - "text": "agree the error contract once, then map it onto each protocol \u2014 and never leak stack traces or internal types", + "text": "agree the error contract once, then map it onto each protocol, and never leak stack traces or internal types", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "agree the error contract once, then map it onto each protocol \u2014 and never leak stack traces or internal types", + "originalText": "agree the error contract once, then map it onto each protocol, and never leak stack traces or internal types", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/18-one-error-model.svg b/assets/diagrams/18-one-error-model.svg index e30de3fc..4177eff8 100644 --- a/assets/diagrams/18-one-error-model.svg +++ b/assets/diagrams/18-one-error-model.svg @@ -27,5 +27,5 @@ -agree the error contract once, then map it onto each protocol — and never leak stack traces or internal types +agree the error contract once, then map it onto each protocol, and never leak stack traces or internal types \ No newline at end of file diff --git a/assets/diagrams/18-rest-errors.excalidraw b/assets/diagrams/18-rest-errors.excalidraw index 852f751d..4095f335 100644 --- a/assets/diagrams/18-rest-errors.excalidraw +++ b/assets/diagrams/18-rest-errors.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "4xx \u2014 client error", + "text": "4xx: client error", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "4xx \u2014 client error", + "originalText": "4xx: client error", "lineHeight": 1.25, "baseline": 14 }, @@ -154,13 +154,13 @@ "updated": 1, "link": null, "locked": false, - "text": "429 / 503 \u2014 busy", + "text": "429 / 503: busy", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "429 / 503 \u2014 busy", + "originalText": "429 / 503: busy", "lineHeight": 1.25, "baseline": 14 }, @@ -252,13 +252,13 @@ "updated": 1, "link": null, "locked": false, - "text": "5xx \u2014 server error", + "text": "5xx: server error", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "5xx \u2014 server error", + "originalText": "5xx: server error", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/18-rest-errors.svg b/assets/diagrams/18-rest-errors.svg index cad51ea7..1ba94b86 100644 --- a/assets/diagrams/18-rest-errors.svg +++ b/assets/diagrams/18-rest-errors.svg @@ -1,13 +1,13 @@ -4xx — client error +4xx: client error fix the request; do not retry as-is -429 / 503 — busy +429 / 503: busy back off; honour the Retry-After header -5xx — server error +5xx: server error retry idempotent calls with backoff application/problem+json · RFC 9457 diff --git a/assets/diagrams/18-retry-storm.excalidraw b/assets/diagrams/18-retry-storm.excalidraw index c27b81fa..0c8df115 100644 --- a/assets/diagrams/18-retry-storm.excalidraw +++ b/assets/diagrams/18-retry-storm.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "The storm \u2014 a positive feedback loop", + "text": "The storm: a positive feedback loop", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "The storm \u2014 a positive feedback loop", + "originalText": "The storm: a positive feedback loop", "lineHeight": 1.25, "baseline": 12 }, @@ -1129,13 +1129,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each control removes one multiplier from the loop \u2014 together they turn a blip back into a non-event", + "text": "each control removes one multiplier from the loop: together they turn a blip back into a non-event", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each control removes one multiplier from the loop \u2014 together they turn a blip back into a non-event", + "originalText": "each control removes one multiplier from the loop: together they turn a blip back into a non-event", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/18-retry-storm.svg b/assets/diagrams/18-retry-storm.svg index 04622367..30de7b0e 100644 --- a/assets/diagrams/18-retry-storm.svg +++ b/assets/diagrams/18-retry-storm.svg @@ -1,7 +1,7 @@ -The storm — a positive feedback loop +The storm: a positive feedback loop The controls that break the loop @@ -35,5 +35,5 @@ more timeouts more timeouts each loop adds load to a service that is already failing -each control removes one multiplier from the loop — together they turn a blip back into a non-event +each control removes one multiplier from the loop: together they turn a blip back into a non-event \ No newline at end of file diff --git a/assets/diagrams/19-context-mapping.excalidraw b/assets/diagrams/19-context-mapping.excalidraw index d32630f1..654954b2 100644 --- a/assets/diagrams/19-context-mapping.excalidraw +++ b/assets/diagrams/19-context-mapping.excalidraw @@ -791,13 +791,13 @@ "updated": 1, "link": null, "locked": false, - "text": "share a model \u2014 high coupling, sparingly", + "text": "share a model: high coupling, sparingly", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "share a model \u2014 high coupling, sparingly", + "originalText": "share a model: high coupling, sparingly", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/19-context-mapping.svg b/assets/diagrams/19-context-mapping.svg index 5d16e20f..7377b701 100644 --- a/assets/diagrams/19-context-mapping.svg +++ b/assets/diagrams/19-context-mapping.svg @@ -23,7 +23,7 @@ Shared Kernel -share a model — high coupling, sparingly +share a model: high coupling, sparingly Partnership diff --git a/assets/diagrams/19-hexagonal-ports.excalidraw b/assets/diagrams/19-hexagonal-ports.excalidraw index eca04ae9..4019085e 100644 --- a/assets/diagrams/19-hexagonal-ports.excalidraw +++ b/assets/diagrams/19-hexagonal-ports.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Hexagonal architecture \u2014 adapters plug into ports around an isolated domain core", + "text": "Hexagonal architecture: adapters plug into ports around an isolated domain core", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Hexagonal architecture \u2014 adapters plug into ports around an isolated domain core", + "originalText": "Hexagonal architecture: adapters plug into ports around an isolated domain core", "lineHeight": 1.25, "baseline": 12 }, @@ -929,13 +929,13 @@ "updated": 1, "link": null, "locked": false, - "text": "dependencies point inward \u2014 adapters depend on the domain, never the reverse", + "text": "dependencies point inward: adapters depend on the domain, never the reverse", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "dependencies point inward \u2014 adapters depend on the domain, never the reverse", + "originalText": "dependencies point inward: adapters depend on the domain, never the reverse", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/19-hexagonal-ports.svg b/assets/diagrams/19-hexagonal-ports.svg index 29df2bad..dad14043 100644 --- a/assets/diagrams/19-hexagonal-ports.svg +++ b/assets/diagrams/19-hexagonal-ports.svg @@ -1,7 +1,7 @@ -Hexagonal architecture — adapters plug into ports around an isolated domain core +Hexagonal architecture: adapters plug into ports around an isolated domain core REST adapter @@ -28,6 +28,6 @@ outbound port outbound port -dependencies point inward — adapters depend on the domain, never the reverse +dependencies point inward: adapters depend on the domain, never the reverse add or swap any adapter without touching a line of domain logic \ No newline at end of file diff --git a/assets/diagrams/19-strategic-ddd.excalidraw b/assets/diagrams/19-strategic-ddd.excalidraw index 49066bfb..4f930f36 100644 --- a/assets/diagrams/19-strategic-ddd.excalidraw +++ b/assets/diagrams/19-strategic-ddd.excalidraw @@ -595,13 +595,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each subdomain becomes one or more bounded contexts \u2014 a model boundary with its own ubiquitous language", + "text": "each subdomain becomes one or more bounded contexts: a model boundary with its own ubiquitous language", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each subdomain becomes one or more bounded contexts \u2014 a model boundary with its own ubiquitous language", + "originalText": "each subdomain becomes one or more bounded contexts: a model boundary with its own ubiquitous language", "lineHeight": 1.25, "baseline": 14 }, @@ -658,13 +658,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the API is that boundary \u2014 one context's \"order\" is not another's", + "text": "the API is that boundary: one context's \"order\" is not another's", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the API is that boundary \u2014 one context's \"order\" is not another's", + "originalText": "the API is that boundary: one context's \"order\" is not another's", "lineHeight": 1.25, "baseline": 14 }, @@ -728,13 +728,13 @@ "updated": 1, "link": null, "locked": false, - "text": "a bounded context owns one model and one ubiquitous language \u2014 and exposes it to others through an API", + "text": "a bounded context owns one model and one ubiquitous language, and exposes it to others through an API", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "a bounded context owns one model and one ubiquitous language \u2014 and exposes it to others through an API", + "originalText": "a bounded context owns one model and one ubiquitous language, and exposes it to others through an API", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/19-strategic-ddd.svg b/assets/diagrams/19-strategic-ddd.svg index c4aa383f..677d9e3d 100644 --- a/assets/diagrams/19-strategic-ddd.svg +++ b/assets/diagrams/19-strategic-ddd.svg @@ -17,9 +17,9 @@ buy / adopt off-the-shelf e.g. auth, notification -each subdomain becomes one or more bounded contexts — a model boundary with its own ubiquitous language +each subdomain becomes one or more bounded contexts: a model boundary with its own ubiquitous language -the API is that boundary — one context's "order" is not another's +the API is that boundary: one context's "order" is not another's the contract translates between models; it never shares internals -a bounded context owns one model and one ubiquitous language — and exposes it to others through an API +a bounded context owns one model and one ubiquitous language, and exposes it to others through an API \ No newline at end of file diff --git a/assets/diagrams/20-connascence.excalidraw b/assets/diagrams/20-connascence.excalidraw index e9347534..32f44f59 100644 --- a/assets/diagrams/20-connascence.excalidraw +++ b/assets/diagrams/20-connascence.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Static \u2014 in the code (weaker \u2191 \u00b7 stronger \u2193)", + "text": "Static: in the code (weaker \u2191 \u00b7 stronger \u2193)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Static \u2014 in the code (weaker \u2191 \u00b7 stronger \u2193)", + "originalText": "Static: in the code (weaker \u2191 \u00b7 stronger \u2193)", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Dynamic \u2014 at runtime (weaker \u2191 \u00b7 stronger \u2193)", + "text": "Dynamic: at runtime (weaker \u2191 \u00b7 stronger \u2193)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Dynamic \u2014 at runtime (weaker \u2191 \u00b7 stronger \u2193)", + "originalText": "Dynamic: at runtime (weaker \u2191 \u00b7 stronger \u2193)", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/20-connascence.svg b/assets/diagrams/20-connascence.svg index e869ea1c..55c371c4 100644 --- a/assets/diagrams/20-connascence.svg +++ b/assets/diagrams/20-connascence.svg @@ -1,9 +1,9 @@ -Static — in the code (weaker ↑ · stronger ↓) +Static: in the code (weaker ↑ · stronger ↓) -Dynamic — at runtime (weaker ↑ · stronger ↓) +Dynamic: at runtime (weaker ↑ · stronger ↓) Name agree on an identifier diff --git a/assets/diagrams/20-coupling-quadrant.excalidraw b/assets/diagrams/20-coupling-quadrant.excalidraw index daa1efa5..6fac2793 100644 --- a/assets/diagrams/20-coupling-quadrant.excalidraw +++ b/assets/diagrams/20-coupling-quadrant.excalidraw @@ -91,13 +91,13 @@ "updated": 1, "link": null, "locked": false, - "text": "strong + close \u2014 healthy", + "text": "strong + close: healthy", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "strong + close \u2014 healthy", + "originalText": "strong + close: healthy", "lineHeight": 1.25, "baseline": 11 }, @@ -224,13 +224,13 @@ "updated": 1, "link": null, "locked": false, - "text": "strong + distant \u2014 the trap", + "text": "strong + distant: the trap", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "strong + distant \u2014 the trap", + "originalText": "strong + distant: the trap", "lineHeight": 1.25, "baseline": 11 }, @@ -770,13 +770,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Volatility is the trigger \u2014 even the trap quadrant is harmless on code that never changes.", + "text": "Volatility is the trigger: even the trap quadrant is harmless on code that never changes.", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Volatility is the trigger \u2014 even the trap quadrant is harmless on code that never changes.", + "originalText": "Volatility is the trigger: even the trap quadrant is harmless on code that never changes.", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/20-coupling-quadrant.svg b/assets/diagrams/20-coupling-quadrant.svg index 349ab9d6..f7bf221c 100644 --- a/assets/diagrams/20-coupling-quadrant.svg +++ b/assets/diagrams/20-coupling-quadrant.svg @@ -2,11 +2,11 @@ Cohesive module -strong + close — healthy +strong + close: healthy keep it local Distributed monolith -strong + distant — the trap +strong + distant: the trap one change ripples across services Needless indirection @@ -22,5 +22,5 @@ close distant ← integration strength (vertical) · distance (horizontal) → -Volatility is the trigger — even the trap quadrant is harmless on code that never changes. +Volatility is the trigger: even the trap quadrant is harmless on code that never changes. \ No newline at end of file diff --git a/assets/diagrams/20-cynefin-coupling.excalidraw b/assets/diagrams/20-cynefin-coupling.excalidraw index 324a12ab..ea6407ce 100644 --- a/assets/diagrams/20-cynefin-coupling.excalidraw +++ b/assets/diagrams/20-cynefin-coupling.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Complex \u2014 probe \u00b7 sense \u00b7 respond", + "text": "Complex: probe \u00b7 sense \u00b7 respond", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Complex \u2014 probe \u00b7 sense \u00b7 respond", + "originalText": "Complex: probe \u00b7 sense \u00b7 respond", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Complicated \u2014 sense \u00b7 analyse \u00b7 respond", + "text": "Complicated: sense \u00b7 analyse \u00b7 respond", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Complicated \u2014 sense \u00b7 analyse \u00b7 respond", + "originalText": "Complicated: sense \u00b7 analyse \u00b7 respond", "lineHeight": 1.25, "baseline": 12 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Chaotic \u2014 act \u00b7 sense \u00b7 respond", + "text": "Chaotic: act \u00b7 sense \u00b7 respond", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Chaotic \u2014 act \u00b7 sense \u00b7 respond", + "originalText": "Chaotic: act \u00b7 sense \u00b7 respond", "lineHeight": 1.25, "baseline": 12 }, @@ -245,13 +245,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Clear \u2014 sense \u00b7 categorise \u00b7 respond", + "text": "Clear: sense \u00b7 categorise \u00b7 respond", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Clear \u2014 sense \u00b7 categorise \u00b7 respond", + "originalText": "Clear: sense \u00b7 categorise \u00b7 respond", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/20-cynefin-coupling.svg b/assets/diagrams/20-cynefin-coupling.svg index c0e022b3..4ad12a3a 100644 --- a/assets/diagrams/20-cynefin-coupling.svg +++ b/assets/diagrams/20-cynefin-coupling.svg @@ -1,13 +1,13 @@ -Complex — probe · sense · respond +Complex: probe · sense · respond -Complicated — sense · analyse · respond +Complicated: sense · analyse · respond -Chaotic — act · sense · respond +Chaotic: act · sense · respond -Clear — sense · categorise · respond +Clear: sense · categorise · respond Loose & reversible favour events / contracts; diff --git a/assets/diagrams/20-three-dimensions.excalidraw b/assets/diagrams/20-three-dimensions.excalidraw index c3bc56b7..0f4b323d 100644 --- a/assets/diagrams/20-three-dimensions.excalidraw +++ b/assets/diagrams/20-three-dimensions.excalidraw @@ -595,13 +595,13 @@ "updated": 1, "link": null, "locked": false, - "text": "strong + distant = global complexity (a distributed monolith) \u2014 but it only bites when the code is volatile", + "text": "strong + distant = global complexity (a distributed monolith), but it only bites when the code is volatile", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "strong + distant = global complexity (a distributed monolith) \u2014 but it only bites when the code is volatile", + "originalText": "strong + distant = global complexity (a distributed monolith), but it only bites when the code is volatile", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/20-three-dimensions.svg b/assets/diagrams/20-three-dimensions.svg index 3817a325..6462ddda 100644 --- a/assets/diagrams/20-three-dimensions.svg +++ b/assets/diagrams/20-three-dimensions.svg @@ -17,7 +17,7 @@ core vs generic subdomain cost of a coupling -strong + distant = global complexity (a distributed monolith) — but it only bites when the code is volatile +strong + distant = global complexity (a distributed monolith), but it only bites when the code is volatile × × a coupling only hurts when shared knowledge, distance, and volatility are all high at once diff --git a/assets/diagrams/21-per-workload.excalidraw b/assets/diagrams/21-per-workload.excalidraw index 0592bdf0..a6aff3a8 100644 --- a/assets/diagrams/21-per-workload.excalidraw +++ b/assets/diagrams/21-per-workload.excalidraw @@ -196,13 +196,13 @@ "updated": 1, "link": null, "locked": false, - "text": "\u2014 the one that's automatic", + "text": ": the one that's automatic", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "\u2014 the one that's automatic", + "originalText": ": the one that's automatic", "lineHeight": 1.25, "baseline": 11 }, @@ -602,13 +602,13 @@ "updated": 1, "link": null, "locked": false, - "text": "\u2014 Appendix C", + "text": "Appendix C", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "\u2014 Appendix C", + "originalText": "Appendix C", "lineHeight": 1.25, "baseline": 11 }, @@ -903,13 +903,13 @@ "updated": 1, "link": null, "locked": false, - "text": "a hard SIGKILL is always possible \u2014 idempotent work means a redelivered request or message is safe", + "text": "a hard SIGKILL is always possible: idempotent work means a redelivered request or message is safe", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "a hard SIGKILL is always possible \u2014 idempotent work means a redelivered request or message is safe", + "originalText": "a hard SIGKILL is always possible: idempotent work means a redelivered request or message is safe", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/21-per-workload.svg b/assets/diagrams/21-per-workload.svg index fb4eae56..1c0b48f5 100644 --- a/assets/diagrams/21-per-workload.svg +++ b/assets/diagrams/21-per-workload.svg @@ -5,7 +5,7 @@ stop accepting new finish in-flight requests bounded by a timeout -— the one that's automatic +the one that's automatic Kafka consumer stop polling @@ -17,7 +17,7 @@ send a close / go-away clients reconnect elsewhere lean on seq + backplane -— Appendix C +Appendix C Jobs / scheduler don't start new work @@ -26,6 +26,6 @@ resume after restart make every handler idempotent -a hard SIGKILL is always possible — idempotent work means a redelivered request or message is safe +a hard SIGKILL is always possible: idempotent work means a redelivered request or message is safe stop taking new work, finish or hand off what's in flight, release resources, then exit \ No newline at end of file diff --git a/assets/diagrams/21-shutdown-sequence.excalidraw b/assets/diagrams/21-shutdown-sequence.excalidraw index 113f93e8..8473f15a 100644 --- a/assets/diagrams/21-shutdown-sequence.excalidraw +++ b/assets/diagrams/21-shutdown-sequence.excalidraw @@ -1016,13 +1016,13 @@ "updated": 1, "link": null, "locked": false, - "text": "liveness must stay UP throughout \u2014 or the kubelet restarts a pod that is draining", + "text": "liveness must stay UP throughout, or the kubelet restarts a pod that is draining", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "liveness must stay UP throughout \u2014 or the kubelet restarts a pod that is draining", + "originalText": "liveness must stay UP throughout, or the kubelet restarts a pod that is draining", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/21-shutdown-sequence.svg b/assets/diagrams/21-shutdown-sequence.svg index af709c96..cbe5f76d 100644 --- a/assets/diagrams/21-shutdown-sequence.svg +++ b/assets/diagrams/21-shutdown-sequence.svg @@ -31,6 +31,6 @@ triggers triggers readiness DOWN + preStop keep new traffic off the dying pod during the async-removal race -liveness must stay UP throughout — or the kubelet restarts a pod that is draining +liveness must stay UP throughout, or the kubelet restarts a pod that is draining time → \ No newline at end of file diff --git a/assets/diagrams/22-business-rule-routing.excalidraw b/assets/diagrams/22-business-rule-routing.excalidraw index 2740fee6..8060e6b8 100644 --- a/assets/diagrams/22-business-rule-routing.excalidraw +++ b/assets/diagrams/22-business-rule-routing.excalidraw @@ -1146,13 +1146,13 @@ "updated": 1, "link": null, "locked": false, - "text": "when 'route by header' isn't enough \u2014 when the decision is a business rule \u2014 push it into a rule engine inside the service", + "text": "when 'route by header' isn't enough. When the decision is a business rule, push it into a rule engine inside the service", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "when 'route by header' isn't enough \u2014 when the decision is a business rule \u2014 push it into a rule engine inside the service", + "originalText": "when 'route by header' isn't enough. When the decision is a business rule, push it into a rule engine inside the service", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/22-business-rule-routing.svg b/assets/diagrams/22-business-rule-routing.svg index 0cdafdb2..485921d0 100644 --- a/assets/diagrams/22-business-rule-routing.svg +++ b/assets/diagrams/22-business-rule-routing.svg @@ -33,5 +33,5 @@ -when 'route by header' isn't enough — when the decision is a business rule — push it into a rule engine inside the service +when 'route by header' isn't enough: when the decision is a business rule: push it into a rule engine inside the service \ No newline at end of file diff --git a/assets/diagrams/22-hop-cost.excalidraw b/assets/diagrams/22-hop-cost.excalidraw index bcd68e70..289516d8 100644 --- a/assets/diagrams/22-hop-cost.excalidraw +++ b/assets/diagrams/22-hop-cost.excalidraw @@ -1309,13 +1309,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the budget is finite \u2014 two layers can be cheap; four overlapping layers are where p99 latency grows", + "text": "the budget is finite: two layers can be cheap; four overlapping layers are where p99 latency grows", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the budget is finite \u2014 two layers can be cheap; four overlapping layers are where p99 latency grows", + "originalText": "the budget is finite: two layers can be cheap; four overlapping layers are where p99 latency grows", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/22-hop-cost.svg b/assets/diagrams/22-hop-cost.svg index 1c0904ed..08461334 100644 --- a/assets/diagrams/22-hop-cost.svg +++ b/assets/diagrams/22-hop-cost.svg @@ -40,5 +40,5 @@ every hop must pay for itself -the budget is finite — two layers can be cheap; four overlapping layers are where p99 latency grows +the budget is finite: two layers can be cheap; four overlapping layers are where p99 latency grows \ No newline at end of file diff --git a/assets/diagrams/22-l4-vs-l7.excalidraw b/assets/diagrams/22-l4-vs-l7.excalidraw index 92d8734a..0e170f15 100644 --- a/assets/diagrams/22-l4-vs-l7.excalidraw +++ b/assets/diagrams/22-l4-vs-l7.excalidraw @@ -854,13 +854,13 @@ "updated": 1, "link": null, "locked": false, - "text": "L7 routers can act on anything in the HTTP/gRPC envelope \u2014 paths, headers, methods, even gRPC service.method", + "text": "L7 routers can act on anything in the HTTP/gRPC envelope: paths, headers, methods, even gRPC service.method", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "L7 routers can act on anything in the HTTP/gRPC envelope \u2014 paths, headers, methods, even gRPC service.method", + "originalText": "L7 routers can act on anything in the HTTP/gRPC envelope: paths, headers, methods, even gRPC service.method", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/22-l4-vs-l7.svg b/assets/diagrams/22-l4-vs-l7.svg index 9a19f5f9..53bc8134 100644 --- a/assets/diagrams/22-l4-vs-l7.svg +++ b/assets/diagrams/22-l4-vs-l7.svg @@ -24,5 +24,5 @@ path / header / cookie → backend header → canary, version, user inject / rewrite headers; rate-limit -L7 routers can act on anything in the HTTP/gRPC envelope — paths, headers, methods, even gRPC service.method +L7 routers can act on anything in the HTTP/gRPC envelope: paths, headers, methods, even gRPC service.method \ No newline at end of file diff --git a/assets/diagrams/22-l7-journey.excalidraw b/assets/diagrams/22-l7-journey.excalidraw index 74cdac8c..b43b22f0 100644 --- a/assets/diagrams/22-l7-journey.excalidraw +++ b/assets/diagrams/22-l7-journey.excalidraw @@ -690,13 +690,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each box can refuse, transform, or branch the request \u2014 what looks like one HTTP request is a chain of L7 decisions by independent components", + "text": "each box can refuse, transform, or branch the request: what looks like one HTTP request is a chain of L7 decisions by independent components", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each box can refuse, transform, or branch the request \u2014 what looks like one HTTP request is a chain of L7 decisions by independent components", + "originalText": "each box can refuse, transform, or branch the request: what looks like one HTTP request is a chain of L7 decisions by independent components", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/22-l7-journey.svg b/assets/diagrams/22-l7-journey.svg index c719336b..170e40af 100644 --- a/assets/diagrams/22-l7-journey.svg +++ b/assets/diagrams/22-l7-journey.svg @@ -19,5 +19,5 @@ -each box can refuse, transform, or branch the request — what looks like one HTTP request is a chain of L7 decisions by independent components +each box can refuse, transform, or branch the request: what looks like one HTTP request is a chain of L7 decisions by independent components \ No newline at end of file diff --git a/assets/diagrams/22-l7-layers.excalidraw b/assets/diagrams/22-l7-layers.excalidraw index 36f38b7e..87dbf0b2 100644 --- a/assets/diagrams/22-l7-layers.excalidraw +++ b/assets/diagrams/22-l7-layers.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "North / south \u2014 a request is a chain of L7 decisions", + "text": "North / south: a request is a chain of L7 decisions", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "North / south \u2014 a request is a chain of L7 decisions", + "originalText": "North / south: a request is a chain of L7 decisions", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "East / west \u2014 most L7 decisions happen here, between services, in the mesh", + "text": "East / west: most L7 decisions happen here, between services, in the mesh", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "East / west \u2014 most L7 decisions happen here, between services, in the mesh", + "originalText": "East / west: most L7 decisions happen here, between services, in the mesh", "lineHeight": 1.25, "baseline": 12 }, @@ -1091,13 +1091,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the mesh is the same L7 routing, applied to every internal call \u2014 not just at the edge", + "text": "the mesh is the same L7 routing, applied to every internal call: not just at the edge", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the mesh is the same L7 routing, applied to every internal call \u2014 not just at the edge", + "originalText": "the mesh is the same L7 routing, applied to every internal call: not just at the edge", "lineHeight": 1.25, "baseline": 11 }, @@ -1126,13 +1126,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each layer makes a distinct decision, and each emits a trace span \u2014 the path is observable end to end", + "text": "each layer makes a distinct decision, and each emits a trace span: the path is observable end to end", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each layer makes a distinct decision, and each emits a trace span \u2014 the path is observable end to end", + "originalText": "each layer makes a distinct decision, and each emits a trace span: the path is observable end to end", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/22-l7-layers.svg b/assets/diagrams/22-l7-layers.svg index 9edeaf55..2a34ab91 100644 --- a/assets/diagrams/22-l7-layers.svg +++ b/assets/diagrams/22-l7-layers.svg @@ -1,9 +1,9 @@ -North / south — a request is a chain of L7 decisions +North / south: a request is a chain of L7 decisions -East / west — most L7 decisions happen here, between services, in the mesh +East / west: most L7 decisions happen here, between services, in the mesh Client @@ -31,6 +31,6 @@ -the mesh is the same L7 routing, applied to every internal call — not just at the edge -each layer makes a distinct decision, and each emits a trace span — the path is observable end to end +the mesh is the same L7 routing, applied to every internal call: not just at the edge +each layer makes a distinct decision, and each emits a trace span: the path is observable end to end \ No newline at end of file diff --git a/assets/diagrams/22-sticky-sessions.excalidraw b/assets/diagrams/22-sticky-sessions.excalidraw index c6b5bb28..5df19eee 100644 --- a/assets/diagrams/22-sticky-sessions.excalidraw +++ b/assets/diagrams/22-sticky-sessions.excalidraw @@ -196,13 +196,13 @@ "updated": 1, "link": null, "locked": false, - "text": "\u2014 the preferred default", + "text": "the preferred default", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "\u2014 the preferred default", + "originalText": "the preferred default", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/22-sticky-sessions.svg b/assets/diagrams/22-sticky-sessions.svg index 98a448f3..a3494d30 100644 --- a/assets/diagrams/22-sticky-sessions.svg +++ b/assets/diagrams/22-sticky-sessions.svg @@ -5,7 +5,7 @@ any pod gets any request load is even client state lives elsewhere -— the preferred default +the preferred default Cookie-based LB sets a session cookie diff --git a/assets/diagrams/22-traffic-steering.excalidraw b/assets/diagrams/22-traffic-steering.excalidraw index 664ce204..a0c390e0 100644 --- a/assets/diagrams/22-traffic-steering.excalidraw +++ b/assets/diagrams/22-traffic-steering.excalidraw @@ -826,13 +826,13 @@ "updated": 1, "link": null, "locked": false, - "text": "each pattern is a header/weight rule away \u2014 the value is in the deploy and rollback discipline around them", + "text": "each pattern is a header/weight rule away: the value is in the deploy and rollback discipline around them", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "each pattern is a header/weight rule away \u2014 the value is in the deploy and rollback discipline around them", + "originalText": "each pattern is a header/weight rule away: the value is in the deploy and rollback discipline around them", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/22-traffic-steering.svg b/assets/diagrams/22-traffic-steering.svg index 283b9363..7dacddc9 100644 --- a/assets/diagrams/22-traffic-steering.svg +++ b/assets/diagrams/22-traffic-steering.svg @@ -24,5 +24,5 @@ Shadow copy traffic to v2 test under load, no user impact -each pattern is a header/weight rule away — the value is in the deploy and rollback discipline around them +each pattern is a header/weight rule away: the value is in the deploy and rollback discipline around them \ No newline at end of file diff --git a/assets/diagrams/23-strangler-fig.excalidraw b/assets/diagrams/23-strangler-fig.excalidraw index 99cc88c1..3630f767 100644 --- a/assets/diagrams/23-strangler-fig.excalidraw +++ b/assets/diagrams/23-strangler-fig.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Identify \u2192 move \u2192 redirect \u2014 one bounded asset at a time, system live throughout", + "text": "Identify \u2192 move \u2192 redirect: one bounded asset at a time, system live throughout", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Identify \u2192 move \u2192 redirect \u2014 one bounded asset at a time, system live throughout", + "originalText": "Identify \u2192 move \u2192 redirect: one bounded asset at a time, system live throughout", "lineHeight": 1.25, "baseline": 12 }, @@ -717,13 +717,13 @@ "updated": 1, "link": null, "locked": false, - "text": "redirect is a proxy config change, not a client release \u2014 widen to roll forward, narrow to roll back, every step reversible", + "text": "redirect is a proxy config change, not a client release: widen to roll forward, narrow to roll back, every step reversible", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "redirect is a proxy config change, not a client release \u2014 widen to roll forward, narrow to roll back, every step reversible", + "originalText": "redirect is a proxy config change, not a client release: widen to roll forward, narrow to roll back, every step reversible", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/23-strangler-fig.svg b/assets/diagrams/23-strangler-fig.svg index 2e3dee19..4097a449 100644 --- a/assets/diagrams/23-strangler-fig.svg +++ b/assets/diagrams/23-strangler-fig.svg @@ -1,7 +1,7 @@ -Identify → move → redirect — one bounded asset at a time, system live throughout +Identify → move → redirect: one bounded asset at a time, system live throughout Clients one URL @@ -22,5 +22,5 @@ default default step zero: add the proxy first -redirect is a proxy config change, not a client release — widen to roll forward, narrow to roll back, every step reversible +redirect is a proxy config change, not a client release: widen to roll forward, narrow to roll back, every step reversible \ No newline at end of file diff --git a/assets/diagrams/24-decomposed-databases.excalidraw b/assets/diagrams/24-decomposed-databases.excalidraw index aff26e20..ff308f2d 100644 --- a/assets/diagrams/24-decomposed-databases.excalidraw +++ b/assets/diagrams/24-decomposed-databases.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "The application \u2014 one process", + "text": "The application: one process", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "The application \u2014 one process", + "originalText": "The application: one process", "lineHeight": 1.25, "baseline": 12 }, @@ -808,13 +808,13 @@ "updated": 1, "link": null, "locked": false, - "text": "cross-module data is now async / event-driven \u2014 the same discipline as microservices, without the operational cost", + "text": "cross-module data is now async / event-driven: the same discipline as microservices, without the operational cost", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "cross-module data is now async / event-driven \u2014 the same discipline as microservices, without the operational cost", + "originalText": "cross-module data is now async / event-driven: the same discipline as microservices, without the operational cost", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/24-decomposed-databases.svg b/assets/diagrams/24-decomposed-databases.svg index 492db78f..42f18123 100644 --- a/assets/diagrams/24-decomposed-databases.svg +++ b/assets/diagrams/24-decomposed-databases.svg @@ -1,7 +1,7 @@ -The application — one process +The application: one process Orders module @@ -23,6 +23,6 @@ -cross-module data is now async / event-driven — the same discipline as microservices, without the operational cost +cross-module data is now async / event-driven: the same discipline as microservices, without the operational cost promoting one module to a process is now a deployment change, not a data-migration project \ No newline at end of file diff --git a/assets/diagrams/24-decorating-collaborator.excalidraw b/assets/diagrams/24-decorating-collaborator.excalidraw index 202c734f..6e552939 100644 --- a/assets/diagrams/24-decorating-collaborator.excalidraw +++ b/assets/diagrams/24-decorating-collaborator.excalidraw @@ -654,13 +654,13 @@ "updated": 1, "link": null, "locked": false, - "text": "clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API \u2014 unlike a plain proxy, the decorator owns behaviour, not just routing", + "text": "clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API: unlike a plain proxy, the decorator owns behaviour, not just routing", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API \u2014 unlike a plain proxy, the decorator owns behaviour, not just routing", + "originalText": "clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API: unlike a plain proxy, the decorator owns behaviour, not just routing", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/24-decorating-collaborator.svg b/assets/diagrams/24-decorating-collaborator.svg index f5f28d99..3257b591 100644 --- a/assets/diagrams/24-decorating-collaborator.svg +++ b/assets/diagrams/24-decorating-collaborator.svg @@ -19,5 +19,5 @@ decorator emits events too decorator emits events too -clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API — unlike a plain proxy, the decorator owns behaviour, not just routing +clients now talk to the decorator; the legacy service keeps running and is eventually replaced behind the decorator's API: unlike a plain proxy, the decorator owns behaviour, not just routing \ No newline at end of file diff --git a/assets/diagrams/24-modular-monolith.excalidraw b/assets/diagrams/24-modular-monolith.excalidraw index ce49bf13..a0a9fad6 100644 --- a/assets/diagrams/24-modular-monolith.excalidraw +++ b/assets/diagrams/24-modular-monolith.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "The application \u2014 still a single deployable", + "text": "The application: still a single deployable", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "The application \u2014 still a single deployable", + "originalText": "The application: still a single deployable", "lineHeight": 1.25, "baseline": 12 }, @@ -946,13 +946,13 @@ "updated": 1, "link": null, "locked": false, - "text": "modules talk only through their public API \u2014 linters and build rules enforce it, not a gentlemen's agreement", + "text": "modules talk only through their public API: linters and build rules enforce it, not a gentlemen's agreement", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "modules talk only through their public API \u2014 linters and build rules enforce it, not a gentlemen's agreement", + "originalText": "modules talk only through their public API: linters and build rules enforce it, not a gentlemen's agreement", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/24-modular-monolith.svg b/assets/diagrams/24-modular-monolith.svg index 19b5c408..6efb0469 100644 --- a/assets/diagrams/24-modular-monolith.svg +++ b/assets/diagrams/24-modular-monolith.svg @@ -1,7 +1,7 @@ -The application — still a single deployable +The application: still a single deployable Orders module public API only @@ -27,5 +27,5 @@ One database, separate schemas orders.* / inventory.* / payments.* · no cross-schema joins (enforced) -modules talk only through their public API — linters and build rules enforce it, not a gentlemen's agreement +modules talk only through their public API: linters and build rules enforce it, not a gentlemen's agreement \ No newline at end of file diff --git a/assets/diagrams/24-monolith-unit.excalidraw b/assets/diagrams/24-monolith-unit.excalidraw index 92d42d9e..50775c26 100644 --- a/assets/diagrams/24-monolith-unit.excalidraw +++ b/assets/diagrams/24-monolith-unit.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "The monolith \u2014 a single deployable", + "text": "The monolith: a single deployable", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "The monolith \u2014 a single deployable", + "originalText": "The monolith: a single deployable", "lineHeight": 1.25, "baseline": 12 }, @@ -1235,13 +1235,13 @@ "updated": 1, "link": null, "locked": false, - "text": "not always wrong \u2014 often the simplest, fastest path to value when the system fits in one team's head", + "text": "not always wrong: often the simplest, fastest path to value when the system fits in one team's head", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "not always wrong \u2014 often the simplest, fastest path to value when the system fits in one team's head", + "originalText": "not always wrong: often the simplest, fastest path to value when the system fits in one team's head", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/24-monolith-unit.svg b/assets/diagrams/24-monolith-unit.svg index b4070c1d..d59f4042 100644 --- a/assets/diagrams/24-monolith-unit.svg +++ b/assets/diagrams/24-monolith-unit.svg @@ -1,7 +1,7 @@ -The monolith — a single deployable +The monolith: a single deployable Auth @@ -37,5 +37,5 @@ change anywhere → redeploy everything · a bug in Reporting can take down Payments · one scaling unit for different workloads -not always wrong — often the simplest, fastest path to value when the system fits in one team's head +not always wrong: often the simplest, fastest path to value when the system fits in one team's head \ No newline at end of file diff --git a/assets/diagrams/24-proxy-step-zero.excalidraw b/assets/diagrams/24-proxy-step-zero.excalidraw index b7fd9f01..6830749f 100644 --- a/assets/diagrams/24-proxy-step-zero.excalidraw +++ b/assets/diagrams/24-proxy-step-zero.excalidraw @@ -619,13 +619,13 @@ "updated": 1, "link": null, "locked": false, - "text": "zero behaviour change for clients on day one \u2014 but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate", + "text": "zero behaviour change for clients on day one, but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "zero behaviour change for clients on day one \u2014 but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate", + "originalText": "zero behaviour change for clients on day one, but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate", "lineHeight": 1.25, "baseline": 12 } diff --git a/assets/diagrams/24-proxy-step-zero.svg b/assets/diagrams/24-proxy-step-zero.svg index 3836004e..af035003 100644 --- a/assets/diagrams/24-proxy-step-zero.svg +++ b/assets/diagrams/24-proxy-step-zero.svg @@ -18,5 +18,5 @@ future routes future routes -zero behaviour change for clients on day one — but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate +zero behaviour change for clients on day one, but the lever to route traffic to extracted services is now in place; the proxy is also where TLS, auth, rate-limiting and observability consolidate \ No newline at end of file diff --git a/assets/diagrams/24-shared-database.excalidraw b/assets/diagrams/24-shared-database.excalidraw index 830d722a..7342039b 100644 --- a/assets/diagrams/24-shared-database.excalidraw +++ b/assets/diagrams/24-shared-database.excalidraw @@ -733,13 +733,13 @@ "updated": 1, "link": null, "locked": false, - "text": "two apps writing the same tables is a coordination tax \u2014 schema changes need both sides to agree", + "text": "two apps writing the same tables is a coordination tax: schema changes need both sides to agree", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "two apps writing the same tables is a coordination tax \u2014 schema changes need both sides to agree", + "originalText": "two apps writing the same tables is a coordination tax: schema changes need both sides to agree", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/24-shared-database.svg b/assets/diagrams/24-shared-database.svg index 501fd8c6..e31bf566 100644 --- a/assets/diagrams/24-shared-database.svg +++ b/assets/diagrams/24-shared-database.svg @@ -20,6 +20,6 @@ -two apps writing the same tables is a coordination tax — schema changes need both sides to agree +two apps writing the same tables is a coordination tax: schema changes need both sides to agree move on: the next step is to give the new service its OWN store (the decomposed-DB state) \ No newline at end of file diff --git a/assets/diagrams/24-write-back.excalidraw b/assets/diagrams/24-write-back.excalidraw index b56fc32b..2d4bd050 100644 --- a/assets/diagrams/24-write-back.excalidraw +++ b/assets/diagrams/24-write-back.excalidraw @@ -760,13 +760,13 @@ "updated": 1, "link": null, "locked": false, - "text": "write latency = cache latency; a background flusher drains to the DB \u2014 a crash before flush loses unpersisted writes", + "text": "write latency = cache latency; a background flusher drains to the DB: a crash before flush loses unpersisted writes", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "write latency = cache latency; a background flusher drains to the DB \u2014 a crash before flush loses unpersisted writes", + "originalText": "write latency = cache latency; a background flusher drains to the DB: a crash before flush loses unpersisted writes", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/24-write-back.svg b/assets/diagrams/24-write-back.svg index e074f1cb..91187d80 100644 --- a/assets/diagrams/24-write-back.svg +++ b/assets/diagrams/24-write-back.svg @@ -25,5 +25,5 @@ 2 flush (async) 2 flush (async) -write latency = cache latency; a background flusher drains to the DB — a crash before flush loses unpersisted writes +write latency = cache latency; a background flusher drains to the DB: a crash before flush loses unpersisted writes \ No newline at end of file diff --git a/assets/diagrams/24-write-through.excalidraw b/assets/diagrams/24-write-through.excalidraw index 296a32e4..ae34b249 100644 --- a/assets/diagrams/24-write-through.excalidraw +++ b/assets/diagrams/24-write-through.excalidraw @@ -619,13 +619,13 @@ "updated": 1, "link": null, "locked": false, - "text": "both stores written on the write path \u2014 never stale for the writer; the write pays both latencies", + "text": "both stores written on the write path: never stale for the writer; the write pays both latencies", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "both stores written on the write path \u2014 never stale for the writer; the write pays both latencies", + "originalText": "both stores written on the write path: never stale for the writer; the write pays both latencies", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/24-write-through.svg b/assets/diagrams/24-write-through.svg index 18239271..c28a71a0 100644 --- a/assets/diagrams/24-write-through.svg +++ b/assets/diagrams/24-write-through.svg @@ -20,5 +20,5 @@ 2 SET 2 SET -both stores written on the write path — never stale for the writer; the write pays both latencies +both stores written on the write path: never stale for the writer; the write pays both latencies \ No newline at end of file diff --git a/assets/diagrams/25-amplification.excalidraw b/assets/diagrams/25-amplification.excalidraw index 5a3f402c..4b120ea7 100644 --- a/assets/diagrams/25-amplification.excalidraw +++ b/assets/diagrams/25-amplification.excalidraw @@ -689,13 +689,13 @@ "updated": 1, "link": null, "locked": false, - "text": "retries multiply across layers (3\u00d73\u00d73) and synchronise into a thundering herd \u2014 the system's own defence becomes the attack", + "text": "retries multiply across layers (3\u00d73\u00d73) and synchronise into a thundering herd: the system's own defence becomes the attack", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "retries multiply across layers (3\u00d73\u00d73) and synchronise into a thundering herd \u2014 the system's own defence becomes the attack", + "originalText": "retries multiply across layers (3\u00d73\u00d73) and synchronise into a thundering herd: the system's own defence becomes the attack", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/25-amplification.svg b/assets/diagrams/25-amplification.svg index d209302f..2e5c45c6 100644 --- a/assets/diagrams/25-amplification.svg +++ b/assets/diagrams/25-amplification.svg @@ -22,6 +22,6 @@ 9 → 27 9 → 27 -retries multiply across layers (3×3×3) and synchronise into a thundering herd — the system's own defence becomes the attack +retries multiply across layers (3×3×3) and synchronise into a thundering herd: the system's own defence becomes the attack break it: backoff + jitter, a retry budget (cap % of live traffic), retry at one layer only, and a circuit breaker \ No newline at end of file diff --git a/assets/diagrams/25-failure-taxonomy.excalidraw b/assets/diagrams/25-failure-taxonomy.excalidraw index 8b04acf6..8b554a94 100644 --- a/assets/diagrams/25-failure-taxonomy.excalidraw +++ b/assets/diagrams/25-failure-taxonomy.excalidraw @@ -795,13 +795,13 @@ "updated": 1, "link": null, "locked": false, - "text": "all management is risk management \u2014 you manage the distribution of failures, not their existence", + "text": "all management is risk management: you manage the distribution of failures, not their existence", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "all management is risk management \u2014 you manage the distribution of failures, not their existence", + "originalText": "all management is risk management: you manage the distribution of failures, not their existence", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-failure-taxonomy.svg b/assets/diagrams/25-failure-taxonomy.svg index 5e9ecb2c..d3530bb4 100644 --- a/assets/diagrams/25-failure-taxonomy.svg +++ b/assets/diagrams/25-failure-taxonomy.svg @@ -22,5 +22,5 @@ -all management is risk management — you manage the distribution of failures, not their existence +all management is risk management: you manage the distribution of failures, not their existence \ No newline at end of file diff --git a/assets/diagrams/25-istio-resilience.excalidraw b/assets/diagrams/25-istio-resilience.excalidraw index acdde746..48634713 100644 --- a/assets/diagrams/25-istio-resilience.excalidraw +++ b/assets/diagrams/25-istio-resilience.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Istio sidecar (Envoy) \u2014 uniform, config-driven, no app code", + "text": "Istio sidecar (Envoy): uniform, config-driven, no app code", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Istio sidecar (Envoy) \u2014 uniform, config-driven, no app code", + "originalText": "Istio sidecar (Envoy): uniform, config-driven, no app code", "lineHeight": 1.25, "baseline": 12 }, @@ -577,13 +577,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection) \u2014 don't also retry in the app", + "text": "the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection): don't also retry in the app", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection) \u2014 don't also retry in the app", + "originalText": "the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection): don't also retry in the app", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-istio-resilience.svg b/assets/diagrams/25-istio-resilience.svg index 3df6c804..e959d47e 100644 --- a/assets/diagrams/25-istio-resilience.svg +++ b/assets/diagrams/25-istio-resilience.svg @@ -1,7 +1,7 @@ -Istio sidecar (Envoy) — uniform, config-driven, no app code +Istio sidecar (Envoy): uniform, config-driven, no app code Caller + sidecar @@ -17,5 +17,5 @@ outlier → eject outlier → eject -the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection) — don't also retry in the app +the mesh already gives timeouts, retries, mesh-bulkheads (connectionPool) and gray-failure ejection (outlierDetection): don't also retry in the app \ No newline at end of file diff --git a/assets/diagrams/25-network-partition.excalidraw b/assets/diagrams/25-network-partition.excalidraw index aaa03a6a..4b6f8d3f 100644 --- a/assets/diagrams/25-network-partition.excalidraw +++ b/assets/diagrams/25-network-partition.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Partition A (3 nodes \u2014 majority)", + "text": "Partition A (3 nodes: majority)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Partition A (3 nodes \u2014 majority)", + "originalText": "Partition A (3 nodes: majority)", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Partition B (2 nodes \u2014 minority)", + "text": "Partition B (2 nodes: minority)", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Partition B (2 nodes \u2014 minority)", + "originalText": "Partition B (2 nodes: minority)", "lineHeight": 1.25, "baseline": 12 }, @@ -547,13 +547,13 @@ "updated": 1, "link": null, "locked": false, - "text": "every node is healthy \u2014 the network between them failed", + "text": "every node is healthy: the network between them failed", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "every node is healthy \u2014 the network between them failed", + "originalText": "every node is healthy: the network between them failed", "lineHeight": 1.25, "baseline": 11 }, @@ -582,13 +582,13 @@ "updated": 1, "link": null, "locked": false, - "text": "CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later) \u2014 not both", + "text": "CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later), not both", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later) \u2014 not both", + "originalText": "CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later), not both", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-network-partition.svg b/assets/diagrams/25-network-partition.svg index 6210d478..b8598019 100644 --- a/assets/diagrams/25-network-partition.svg +++ b/assets/diagrams/25-network-partition.svg @@ -1,9 +1,9 @@ -Partition A (3 nodes — majority) +Partition A (3 nodes: majority) -Partition B (2 nodes — minority) +Partition B (2 nodes: minority) node-1 @@ -17,6 +17,6 @@ ✕ link down ✕ link down -every node is healthy — the network between them failed -CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later) — not both +every node is healthy: the network between them failed +CAP: stay consistent (minority refuses writes) or available (both accept, reconcile later), not both \ No newline at end of file diff --git a/assets/diagrams/25-partial-failure.excalidraw b/assets/diagrams/25-partial-failure.excalidraw index 31a23cac..1838856a 100644 --- a/assets/diagrams/25-partial-failure.excalidraw +++ b/assets/diagrams/25-partial-failure.excalidraw @@ -189,13 +189,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Inventory \u2014 healthy", + "text": "Inventory: healthy", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Inventory \u2014 healthy", + "originalText": "Inventory: healthy", "lineHeight": 1.25, "baseline": 14 }, @@ -287,13 +287,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Payment \u2014 down", + "text": "Payment: down", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Payment \u2014 down", + "originalText": "Payment: down", "lineHeight": 1.25, "baseline": 14 }, @@ -385,13 +385,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Shipping \u2014 slow", + "text": "Shipping: slow", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Shipping \u2014 slow", + "originalText": "Shipping: slow", "lineHeight": 1.25, "baseline": 14 }, @@ -584,13 +584,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the monolith-to-microservices trap: treating a remote call like a local one \u2014 no timeout, no fallback \u2014 hangs the caller", + "text": "the monolith-to-microservices trap: treating a remote call like a local one (no timeout, no fallback) hangs the caller", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the monolith-to-microservices trap: treating a remote call like a local one \u2014 no timeout, no fallback \u2014 hangs the caller", + "originalText": "the monolith-to-microservices trap: treating a remote call like a local one (no timeout, no fallback) hangs the caller", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-partial-failure.svg b/assets/diagrams/25-partial-failure.svg index cdee36f9..1fea61e7 100644 --- a/assets/diagrams/25-partial-failure.svg +++ b/assets/diagrams/25-partial-failure.svg @@ -5,16 +5,16 @@ one decision per dependency -Inventory — healthy +Inventory: healthy use the result -Payment — down +Payment: down fall back / fail -Shipping — slow +Shipping: slow time out, fall back -the monolith-to-microservices trap: treating a remote call like a local one — no timeout, no fallback — hangs the caller +the monolith-to-microservices trap: treating a remote call like a local one (no timeout, no fallback) hangs the caller \ No newline at end of file diff --git a/assets/diagrams/25-split-brain.excalidraw b/assets/diagrams/25-split-brain.excalidraw index e80417a5..7ba5ed30 100644 --- a/assets/diagrams/25-split-brain.excalidraw +++ b/assets/diagrams/25-split-brain.excalidraw @@ -463,13 +463,13 @@ "updated": 1, "link": null, "locked": false, - "text": "cure: quorum \u2014 an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd)", + "text": "cure is a quorum: an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd)", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "cure: quorum \u2014 an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd)", + "originalText": "cure is a quorum: an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd)", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-split-brain.svg b/assets/diagrams/25-split-brain.svg index 173d0703..b03307c0 100644 --- a/assets/diagrams/25-split-brain.svg +++ b/assets/diagrams/25-split-brain.svg @@ -14,5 +14,5 @@ ✕ partition ✕ partition both sides promote themselves → two primaries, conflicting writes, divergent state on heal -cure: quorum — an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd) +cure is a quorum: an action needs N/2+1 nodes, so a minority mathematically cannot act (cluster sizes are odd) \ No newline at end of file diff --git a/assets/diagrams/25-timeouts-deadline.excalidraw b/assets/diagrams/25-timeouts-deadline.excalidraw index 05801d13..c0aa1df0 100644 --- a/assets/diagrams/25-timeouts-deadline.excalidraw +++ b/assets/diagrams/25-timeouts-deadline.excalidraw @@ -689,13 +689,13 @@ "updated": 1, "link": null, "locked": false, - "text": "when too little budget remains to plausibly finish, fail immediately \u2014 don't start work the user already abandoned", + "text": "when too little budget remains to plausibly finish, fail immediately: don't start work the user already abandoned", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "when too little budget remains to plausibly finish, fail immediately \u2014 don't start work the user already abandoned", + "originalText": "when too little budget remains to plausibly finish, fail immediately: don't start work the user already abandoned", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/25-timeouts-deadline.svg b/assets/diagrams/25-timeouts-deadline.svg index 1a71603c..7198826c 100644 --- a/assets/diagrams/25-timeouts-deadline.svg +++ b/assets/diagrams/25-timeouts-deadline.svg @@ -22,5 +22,5 @@ 500 left 500 left the deadline travels with the request; each hop subtracts what it used and passes the remainder downstream -when too little budget remains to plausibly finish, fail immediately — don't start work the user already abandoned +when too little budget remains to plausibly finish, fail immediately: don't start work the user already abandoned \ No newline at end of file diff --git a/assets/diagrams/26-deploy-release.excalidraw b/assets/diagrams/26-deploy-release.excalidraw index 3ec60323..05d65d47 100644 --- a/assets/diagrams/26-deploy-release.excalidraw +++ b/assets/diagrams/26-deploy-release.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "deploy \u2260 release \u2014 the artifact ships dark; releasing is a runtime flag flip, not a new deploy", + "text": "deploy \u2260 release: the artifact ships dark; releasing is a runtime flag flip, not a new deploy", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "deploy \u2260 release \u2014 the artifact ships dark; releasing is a runtime flag flip, not a new deploy", + "originalText": "deploy \u2260 release: the artifact ships dark; releasing is a runtime flag flip, not a new deploy", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/26-deploy-release.svg b/assets/diagrams/26-deploy-release.svg index 5aabd0f1..b0e64f1a 100644 --- a/assets/diagrams/26-deploy-release.svg +++ b/assets/diagrams/26-deploy-release.svg @@ -1,7 +1,7 @@ -deploy ≠ release — the artifact ships dark; releasing is a runtime flag flip, not a new deploy +deploy ≠ release: the artifact ships dark; releasing is a runtime flag flip, not a new deploy Build & deploy flag OFF diff --git a/assets/diagrams/26-evaluation-architecture.excalidraw b/assets/diagrams/26-evaluation-architecture.excalidraw index 97a521d9..7146d508 100644 --- a/assets/diagrams/26-evaluation-architecture.excalidraw +++ b/assets/diagrams/26-evaluation-architecture.excalidraw @@ -759,13 +759,13 @@ "updated": 1, "link": null, "locked": false, - "text": "default returned if the provider is unreachable \u2014 a flag system outage must never take the app down", + "text": "default returned if the provider is unreachable: a flag system outage must never take the app down", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "default returned if the provider is unreachable \u2014 a flag system outage must never take the app down", + "originalText": "default returned if the provider is unreachable: a flag system outage must never take the app down", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/26-evaluation-architecture.svg b/assets/diagrams/26-evaluation-architecture.svg index e62c7f0d..113ffc58 100644 --- a/assets/diagrams/26-evaluation-architecture.svg +++ b/assets/diagrams/26-evaluation-architecture.svg @@ -24,6 +24,6 @@ rules rules -default returned if the provider is unreachable — a flag system outage must never take the app down +default returned if the provider is unreachable: a flag system outage must never take the app down the SDK is vendor-neutral (OpenFeature); swap flagd for any provider without touching app code \ No newline at end of file diff --git a/assets/diagrams/26-flag-lifecycle.excalidraw b/assets/diagrams/26-flag-lifecycle.excalidraw index 946340c6..1559e0dd 100644 --- a/assets/diagrams/26-flag-lifecycle.excalidraw +++ b/assets/diagrams/26-flag-lifecycle.excalidraw @@ -549,13 +549,13 @@ "updated": 1, "link": null, "locked": false, - "text": "every release flag is born with a removal ticket \u2014 a stale flag is dead code, a hidden branch, and a live risk surface", + "text": "every release flag is born with a removal ticket: a stale flag is dead code, a hidden branch, and a live risk surface", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "every release flag is born with a removal ticket \u2014 a stale flag is dead code, a hidden branch, and a live risk surface", + "originalText": "every release flag is born with a removal ticket: a stale flag is dead code, a hidden branch, and a live risk surface", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/26-flag-lifecycle.svg b/assets/diagrams/26-flag-lifecycle.svg index 083704f6..c6a0ee94 100644 --- a/assets/diagrams/26-flag-lifecycle.svg +++ b/assets/diagrams/26-flag-lifecycle.svg @@ -15,5 +15,5 @@ -every release flag is born with a removal ticket — a stale flag is dead code, a hidden branch, and a live risk surface +every release flag is born with a removal ticket: a stale flag is dead code, a hidden branch, and a live risk surface \ No newline at end of file diff --git a/assets/diagrams/26-flag-types.excalidraw b/assets/diagrams/26-flag-types.excalidraw index 7f5eb06c..e79b5e1e 100644 --- a/assets/diagrams/26-flag-types.excalidraw +++ b/assets/diagrams/26-flag-types.excalidraw @@ -294,13 +294,13 @@ "updated": 1, "link": null, "locked": false, - "text": "temporary \u2014 ends when the test ends", + "text": "temporary: ends when the test ends", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "temporary \u2014 ends when the test ends", + "originalText": "temporary: ends when the test ends", "lineHeight": 1.25, "baseline": 11 }, @@ -462,13 +462,13 @@ "updated": 1, "link": null, "locked": false, - "text": "long-lived \u2014 a permanent control", + "text": "long-lived: a permanent control", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "long-lived \u2014 a permanent control", + "originalText": "long-lived: a permanent control", "lineHeight": 1.25, "baseline": 11 }, @@ -630,13 +630,13 @@ "updated": 1, "link": null, "locked": false, - "text": "long-lived \u2014 part of the product model", + "text": "long-lived: part of the product model", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "long-lived \u2014 part of the product model", + "originalText": "long-lived: part of the product model", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/26-flag-types.svg b/assets/diagrams/26-flag-types.svg index 4cf45a32..c03b99c1 100644 --- a/assets/diagrams/26-flag-types.svg +++ b/assets/diagrams/26-flag-types.svg @@ -8,17 +8,17 @@ Experiment / A-B · data-owned split variants, measure the metric -temporary — ends when the test ends +temporary: ends when the test ends → sticky bucketing required Ops / kill-switch · SRE-owned disable a feature or dependency FAST -long-lived — a permanent control +long-lived: a permanent control → pairs with circuit breakers Permission / entitlement · product gate by plan, tier, or region -long-lived — part of the product model +long-lived: part of the product model → targeting rules, not a rollout short-lived ← lifetime → long-lived who flips it diff --git a/assets/diagrams/26-flags-control-plane.excalidraw b/assets/diagrams/26-flags-control-plane.excalidraw index 458b120a..661da7e1 100644 --- a/assets/diagrams/26-flags-control-plane.excalidraw +++ b/assets/diagrams/26-flags-control-plane.excalidraw @@ -690,13 +690,13 @@ "updated": 1, "link": null, "locked": false, - "text": "a flag is a runtime control surface \u2014 the same decoupling that powers canaries, cutovers, kill-switches, and experiments", + "text": "a flag is a runtime control surface: the same decoupling that powers canaries, cutovers, kill-switches, and experiments", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "a flag is a runtime control surface \u2014 the same decoupling that powers canaries, cutovers, kill-switches, and experiments", + "originalText": "a flag is a runtime control surface: the same decoupling that powers canaries, cutovers, kill-switches, and experiments", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/26-flags-control-plane.svg b/assets/diagrams/26-flags-control-plane.svg index 21a3494d..82367ac6 100644 --- a/assets/diagrams/26-flags-control-plane.svg +++ b/assets/diagrams/26-flags-control-plane.svg @@ -19,5 +19,5 @@ -a flag is a runtime control surface — the same decoupling that powers canaries, cutovers, kill-switches, and experiments +a flag is a runtime control surface: the same decoupling that powers canaries, cutovers, kill-switches, and experiments \ No newline at end of file diff --git a/assets/diagrams/26-progressive-rollout.excalidraw b/assets/diagrams/26-progressive-rollout.excalidraw index 2e223b67..73e9d15f 100644 --- a/assets/diagrams/26-progressive-rollout.excalidraw +++ b/assets/diagrams/26-progressive-rollout.excalidraw @@ -655,13 +655,13 @@ "updated": 1, "link": null, "locked": false, - "text": "widening the threshold ramps the rollout; narrowing it rolls back \u2014 instantly, without a deploy", + "text": "widening the threshold ramps the rollout; narrowing it rolls back: instantly, without a deploy", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "widening the threshold ramps the rollout; narrowing it rolls back \u2014 instantly, without a deploy", + "originalText": "widening the threshold ramps the rollout; narrowing it rolls back: instantly, without a deploy", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/26-progressive-rollout.svg b/assets/diagrams/26-progressive-rollout.svg index b3c9e8d5..e8c00fa4 100644 --- a/assets/diagrams/26-progressive-rollout.svg +++ b/assets/diagrams/26-progressive-rollout.svg @@ -18,5 +18,5 @@ the same user always lands in the same bucket → consistent assignment: no flicker between variants on repeat visits -widening the threshold ramps the rollout; narrowing it rolls back — instantly, without a deploy +widening the threshold ramps the rollout; narrowing it rolls back: instantly, without a deploy \ No newline at end of file diff --git a/assets/diagrams/27-black-box.excalidraw b/assets/diagrams/27-black-box.excalidraw index 8c5958ab..e37b986e 100644 --- a/assets/diagrams/27-black-box.excalidraw +++ b/assets/diagrams/27-black-box.excalidraw @@ -938,13 +938,13 @@ "updated": 1, "link": null, "locked": false, - "text": "because Newman tests the API as a black box, one collection validates every implementation \u2014 the contract is the spec, not the code", + "text": "because Newman tests the API as a black box, one collection validates every implementation: the contract is the spec, not the code", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "because Newman tests the API as a black box, one collection validates every implementation \u2014 the contract is the spec, not the code", + "originalText": "because Newman tests the API as a black box, one collection validates every implementation: the contract is the spec, not the code", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/27-black-box.svg b/assets/diagrams/27-black-box.svg index 073bd7fc..cd09c6a7 100644 --- a/assets/diagrams/27-black-box.svg +++ b/assets/diagrams/27-black-box.svg @@ -26,5 +26,5 @@ -because Newman tests the API as a black box, one collection validates every implementation — the contract is the spec, not the code +because Newman tests the API as a black box, one collection validates every implementation: the contract is the spec, not the code \ No newline at end of file diff --git a/assets/diagrams/27-ci-gate.excalidraw b/assets/diagrams/27-ci-gate.excalidraw index 3e04a929..eea265a2 100644 --- a/assets/diagrams/27-ci-gate.excalidraw +++ b/assets/diagrams/27-ci-gate.excalidraw @@ -690,13 +690,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the services run on Docker Engine in CI as they do locally \u2014 no managed cloud \u2014 and a failed assertion fails the build", + "text": "the services run on Docker Engine in CI as they do locally: no managed cloud, and a failed assertion fails the build", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the services run on Docker Engine in CI as they do locally \u2014 no managed cloud \u2014 and a failed assertion fails the build", + "originalText": "the services run on Docker Engine in CI as they do locally: no managed cloud, and a failed assertion fails the build", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/27-ci-gate.svg b/assets/diagrams/27-ci-gate.svg index 32507bd8..0f347826 100644 --- a/assets/diagrams/27-ci-gate.svg +++ b/assets/diagrams/27-ci-gate.svg @@ -19,5 +19,5 @@ -the services run on Docker Engine in CI as they do locally — no managed cloud — and a failed assertion fails the build +the services run on Docker Engine in CI as they do locally: no managed cloud, and a failed assertion fails the build \ No newline at end of file diff --git a/assets/diagrams/27-collection-anatomy.excalidraw b/assets/diagrams/27-collection-anatomy.excalidraw index 437cd65d..f194e64b 100644 --- a/assets/diagrams/27-collection-anatomy.excalidraw +++ b/assets/diagrams/27-collection-anatomy.excalidraw @@ -865,13 +865,13 @@ "updated": 1, "link": null, "locked": false, - "text": "tests are JavaScript assertions that run after each response \u2014 a collection is an executable contract, not just a request log", + "text": "tests are JavaScript assertions that run after each response: a collection is an executable contract, not just a request log", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "tests are JavaScript assertions that run after each response \u2014 a collection is an executable contract, not just a request log", + "originalText": "tests are JavaScript assertions that run after each response: a collection is an executable contract, not just a request log", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/27-collection-anatomy.svg b/assets/diagrams/27-collection-anatomy.svg index 5999ca44..57d03152 100644 --- a/assets/diagrams/27-collection-anatomy.svg +++ b/assets/diagrams/27-collection-anatomy.svg @@ -25,5 +25,5 @@ resolved at run resolved at run -tests are JavaScript assertions that run after each response — a collection is an executable contract, not just a request log +tests are JavaScript assertions that run after each response: a collection is an executable contract, not just a request log \ No newline at end of file diff --git a/assets/diagrams/27-newman-run.excalidraw b/assets/diagrams/27-newman-run.excalidraw index 33911f87..e1b0b145 100644 --- a/assets/diagrams/27-newman-run.excalidraw +++ b/assets/diagrams/27-newman-run.excalidraw @@ -830,13 +830,13 @@ "updated": 1, "link": null, "locked": false, - "text": "the same Postman collection your team runs by hand becomes an automated gate \u2014 no new test framework to learn", + "text": "the same Postman collection your team runs by hand becomes an automated gate: no new test framework to learn", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "the same Postman collection your team runs by hand becomes an automated gate \u2014 no new test framework to learn", + "originalText": "the same Postman collection your team runs by hand becomes an automated gate: no new test framework to learn", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/27-newman-run.svg b/assets/diagrams/27-newman-run.svg index 81a7aeea..3c9e6cc9 100644 --- a/assets/diagrams/27-newman-run.svg +++ b/assets/diagrams/27-newman-run.svg @@ -24,5 +24,5 @@ results results -the same Postman collection your team runs by hand becomes an automated gate — no new test framework to learn +the same Postman collection your team runs by hand becomes an automated gate: no new test framework to learn \ No newline at end of file diff --git a/assets/diagrams/27-test-pyramid.excalidraw b/assets/diagrams/27-test-pyramid.excalidraw index 5445d7c1..87a16f16 100644 --- a/assets/diagrams/27-test-pyramid.excalidraw +++ b/assets/diagrams/27-test-pyramid.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "E2E \u2014 few, slow, brittle", + "text": "E2E: few, slow, brittle", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "E2E \u2014 few, slow, brittle", + "originalText": "E2E: few, slow, brittle", "lineHeight": 1.25, "baseline": 14 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "API / contract tests \u2014 Newman runs here", + "text": "API / contract tests: Newman runs here", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "API / contract tests \u2014 Newman runs here", + "originalText": "API / contract tests: Newman runs here", "lineHeight": 1.25, "baseline": 14 }, @@ -245,13 +245,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Unit tests \u2014 many, fast, cheap", + "text": "Unit tests: many, fast, cheap", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Unit tests \u2014 many, fast, cheap", + "originalText": "Unit tests: many, fast, cheap", "lineHeight": 1.25, "baseline": 14 }, @@ -280,13 +280,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR \u2014 it complements unit tests, it does not replace them", + "text": "Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR. It complements unit tests, it does not replace them", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR \u2014 it complements unit tests, it does not replace them", + "originalText": "Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR. It complements unit tests, it does not replace them", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/27-test-pyramid.svg b/assets/diagrams/27-test-pyramid.svg index 07b93a81..0521aa8f 100644 --- a/assets/diagrams/27-test-pyramid.svg +++ b/assets/diagrams/27-test-pyramid.svg @@ -1,12 +1,12 @@ -E2E — few, slow, brittle +E2E: few, slow, brittle -API / contract tests — Newman runs here +API / contract tests: Newman runs here Service / integration tests -Unit tests — many, fast, cheap -Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR — it complements unit tests, it does not replace them +Unit tests: many, fast, cheap +Newman owns the API/contract tier: real HTTP against a running service, fast enough for every PR. It complements unit tests, it does not replace them \ No newline at end of file diff --git a/assets/diagrams/29-container-layers.excalidraw b/assets/diagrams/29-container-layers.excalidraw index d9f86def..0de43c2d 100644 --- a/assets/diagrams/29-container-layers.excalidraw +++ b/assets/diagrams/29-container-layers.excalidraw @@ -2166,13 +2166,13 @@ "updated": 1, "link": null, "locked": false, - "text": "The SDK never ships \u2014 only the runtime and your app DLLs.", + "text": "The SDK never ships: only the runtime and your app DLLs.", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "The SDK never ships \u2014 only the runtime and your app DLLs.", + "originalText": "The SDK never ships: only the runtime and your app DLLs.", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/29-container-layers.svg b/assets/diagrams/29-container-layers.svg index 1b246786..20cc83ee 100644 --- a/assets/diagrams/29-container-layers.svg +++ b/assets/diagrams/29-container-layers.svg @@ -64,5 +64,5 @@ Red Hat UBI images are freely redistributable and supported for production use. -The SDK never ships — only the runtime and your app DLLs. +The SDK never ships: only the runtime and your app DLLs. \ No newline at end of file diff --git a/assets/diagrams/29-dotnet-compilation.excalidraw b/assets/diagrams/29-dotnet-compilation.excalidraw index 0126590e..9605a4af 100644 --- a/assets/diagrams/29-dotnet-compilation.excalidraw +++ b/assets/diagrams/29-dotnet-compilation.excalidraw @@ -1666,13 +1666,13 @@ "updated": 1, "link": null, "locked": false, - "text": "CIL = Common Intermediate Language \u2014 the CPU-agnostic bytecode all .NET languages compile to.", + "text": "CIL = Common Intermediate Language: the CPU-agnostic bytecode all .NET languages compile to.", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "CIL = Common Intermediate Language \u2014 the CPU-agnostic bytecode all .NET languages compile to.", + "originalText": "CIL = Common Intermediate Language: the CPU-agnostic bytecode all .NET languages compile to.", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/29-dotnet-compilation.svg b/assets/diagrams/29-dotnet-compilation.svg index 2b27eebf..b46e1f43 100644 --- a/assets/diagrams/29-dotnet-compilation.svg +++ b/assets/diagrams/29-dotnet-compilation.svg @@ -53,5 +53,5 @@ uses uses C# is one of several .NET languages (F#, VB.NET). -CIL = Common Intermediate Language — the CPU-agnostic bytecode all .NET languages compile to. +CIL = Common Intermediate Language: the CPU-agnostic bytecode all .NET languages compile to. \ No newline at end of file diff --git a/assets/diagrams/29-kestrel-pipeline.excalidraw b/assets/diagrams/29-kestrel-pipeline.excalidraw index df5b6287..69d2cb20 100644 --- a/assets/diagrams/29-kestrel-pipeline.excalidraw +++ b/assets/diagrams/29-kestrel-pipeline.excalidraw @@ -2285,13 +2285,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Kestrel is the built-in cross-platform web server \u2014 no IIS, no Apache, no nginx required.", + "text": "Kestrel is the built-in cross-platform web server: no IIS, no Apache, no nginx required.", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Kestrel is the built-in cross-platform web server \u2014 no IIS, no Apache, no nginx required.", + "originalText": "Kestrel is the built-in cross-platform web server: no IIS, no Apache, no nginx required.", "lineHeight": 1.25, "baseline": 11 } diff --git a/assets/diagrams/29-kestrel-pipeline.svg b/assets/diagrams/29-kestrel-pipeline.svg index b5076216..874fd248 100644 --- a/assets/diagrams/29-kestrel-pipeline.svg +++ b/assets/diagrams/29-kestrel-pipeline.svg @@ -67,5 +67,5 @@ -Kestrel is the built-in cross-platform web server — no IIS, no Apache, no nginx required. +Kestrel is the built-in cross-platform web server: no IIS, no Apache, no nginx required. \ No newline at end of file diff --git a/assets/diagrams/30-signalr-backplane.excalidraw b/assets/diagrams/30-signalr-backplane.excalidraw index 368ac299..720c3265 100644 --- a/assets/diagrams/30-signalr-backplane.excalidraw +++ b/assets/diagrams/30-signalr-backplane.excalidraw @@ -476,13 +476,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Kubernetes Service / load balancer \u2014 sticky per circuit", + "text": "Kubernetes Service / load balancer: sticky per circuit", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Kubernetes Service / load balancer \u2014 sticky per circuit", + "originalText": "Kubernetes Service / load balancer: sticky per circuit", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/30-signalr-backplane.svg b/assets/diagrams/30-signalr-backplane.svg index 9c542d96..aa7f9970 100644 --- a/assets/diagrams/30-signalr-backplane.svg +++ b/assets/diagrams/30-signalr-backplane.svg @@ -14,7 +14,7 @@ blazor-pod-3 0 circuits (new) -Kubernetes Service / load balancer — sticky per circuit +Kubernetes Service / load balancer: sticky per circuit Redis SignalR backplane diff --git a/assets/diagrams/advisory-ci-pipeline.excalidraw b/assets/diagrams/advisory-ci-pipeline.excalidraw index 7e1791b6..e299c463 100644 --- a/assets/diagrams/advisory-ci-pipeline.excalidraw +++ b/assets/diagrams/advisory-ci-pipeline.excalidraw @@ -1438,13 +1438,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Network policy CI/CD pipeline \u2014 every change goes through all stages", + "text": "Network policy CI/CD pipeline: every change goes through all stages", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Network policy CI/CD pipeline \u2014 every change goes through all stages", + "originalText": "Network policy CI/CD pipeline: every change goes through all stages", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/advisory-ci-pipeline.svg b/assets/diagrams/advisory-ci-pipeline.svg index 1009d064..3d9aea47 100644 --- a/assets/diagrams/advisory-ci-pipeline.svg +++ b/assets/diagrams/advisory-ci-pipeline.svg @@ -40,7 +40,7 @@ -Network policy CI/CD pipeline — every change goes through all stages +Network policy CI/CD pipeline: every change goes through all stages CODEOWNERS enforces: platform-baselines → firewall review, app-policies → platform review Fail at any stage → PR blocked. No exceptions, no bypass. \ No newline at end of file diff --git a/assets/diagrams/advisory-team-ownership.excalidraw b/assets/diagrams/advisory-team-ownership.excalidraw index c12f0ea9..be29dae2 100644 --- a/assets/diagrams/advisory-team-ownership.excalidraw +++ b/assets/diagrams/advisory-team-ownership.excalidraw @@ -1431,13 +1431,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Policy ownership model \u2014 who authors, who reviews, who approves", + "text": "Policy ownership model: who authors, who reviews, who approves", "fontSize": 14, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Policy ownership model \u2014 who authors, who reviews, who approves", + "originalText": "Policy ownership model: who authors, who reviews, who approves", "lineHeight": 1.25, "baseline": 14 }, diff --git a/assets/diagrams/advisory-team-ownership.svg b/assets/diagrams/advisory-team-ownership.svg index 714dc6b1..765f4ad5 100644 --- a/assets/diagrams/advisory-team-ownership.svg +++ b/assets/diagrams/advisory-team-ownership.svg @@ -45,7 +45,7 @@ templates templates -Policy ownership model — who authors, who reviews, who approves +Policy ownership model: who authors, who reviews, who approves Gatekeeper → architect Keeps north-south edge Controls cluster posture diff --git a/assets/diagrams/advisory-tier-evaluation.excalidraw b/assets/diagrams/advisory-tier-evaluation.excalidraw index 8e1a1cc4..27afa7eb 100644 --- a/assets/diagrams/advisory-tier-evaluation.excalidraw +++ b/assets/diagrams/advisory-tier-evaluation.excalidraw @@ -56,13 +56,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Tier 1 \u2014 CNP Admin tier", + "text": "Tier 1: CNP Admin tier", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Tier 1 \u2014 CNP Admin tier", + "originalText": "Tier 1: CNP Admin tier", "lineHeight": 1.25, "baseline": 12 }, @@ -119,13 +119,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Tier 2 \u2014 NetworkPolicy", + "text": "Tier 2: NetworkPolicy", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Tier 2 \u2014 NetworkPolicy", + "originalText": "Tier 2: NetworkPolicy", "lineHeight": 1.25, "baseline": 12 }, @@ -182,13 +182,13 @@ "updated": 1, "link": null, "locked": false, - "text": "Tier 3 \u2014 CNP Baseline tier", + "text": "Tier 3: CNP Baseline tier", "fontSize": 12, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "Tier 3 \u2014 CNP Baseline tier", + "originalText": "Tier 3: CNP Baseline tier", "lineHeight": 1.25, "baseline": 12 }, diff --git a/assets/diagrams/advisory-tier-evaluation.svg b/assets/diagrams/advisory-tier-evaluation.svg index 3d5f765d..4cf0d4bf 100644 --- a/assets/diagrams/advisory-tier-evaluation.svg +++ b/assets/diagrams/advisory-tier-evaluation.svg @@ -1,11 +1,11 @@ -Tier 1 — CNP Admin tier +Tier 1: CNP Admin tier -Tier 2 — NetworkPolicy +Tier 2: NetworkPolicy -Tier 3 — CNP Baseline tier +Tier 3: CNP Baseline tier Admin tier evaluates cluster-scoped, priority 0-1000 diff --git a/assets/diagrams/policy-ci-pipeline.excalidraw b/assets/diagrams/policy-ci-pipeline.excalidraw index 28615373..4ca0b2ce 100644 --- a/assets/diagrams/policy-ci-pipeline.excalidraw +++ b/assets/diagrams/policy-ci-pipeline.excalidraw @@ -937,13 +937,13 @@ "updated": 1, "link": null, "locked": false, - "text": "CI/CD validation pipeline \u2014 every policy change goes through all stages", + "text": "CI/CD validation pipeline: every policy change goes through all stages", "fontSize": 13, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "CI/CD validation pipeline \u2014 every policy change goes through all stages", + "originalText": "CI/CD validation pipeline: every policy change goes through all stages", "lineHeight": 1.25, "baseline": 13 }, diff --git a/assets/diagrams/policy-ci-pipeline.svg b/assets/diagrams/policy-ci-pipeline.svg index 6b614052..a03db0ee 100644 --- a/assets/diagrams/policy-ci-pipeline.svg +++ b/assets/diagrams/policy-ci-pipeline.svg @@ -26,6 +26,6 @@ -CI/CD validation pipeline — every policy change goes through all stages +CI/CD validation pipeline: every policy change goes through all stages Fail at any stage → PR blocked. No exceptions, no bypass. \ No newline at end of file diff --git a/assets/diagrams/policy-gitops-flow.excalidraw b/assets/diagrams/policy-gitops-flow.excalidraw index ea30a71b..a50c1055 100644 --- a/assets/diagrams/policy-gitops-flow.excalidraw +++ b/assets/diagrams/policy-gitops-flow.excalidraw @@ -1171,13 +1171,13 @@ "updated": 1, "link": null, "locked": false, - "text": "No human runs kubectl apply in production \u2014 every change is a Git commit", + "text": "No human runs kubectl apply in production: every change is a Git commit", "fontSize": 11, "fontFamily": 1, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "No human runs kubectl apply in production \u2014 every change is a Git commit", + "originalText": "No human runs kubectl apply in production: every change is a Git commit", "lineHeight": 1.25, "baseline": 11 }, diff --git a/assets/diagrams/policy-gitops-flow.svg b/assets/diagrams/policy-gitops-flow.svg index d15e52e9..e3084cfa 100644 --- a/assets/diagrams/policy-gitops-flow.svg +++ b/assets/diagrams/policy-gitops-flow.svg @@ -34,5 +34,5 @@ drift detection GitOps pipeline: the only path to production -No human runs kubectl apply in production — every change is a Git commit +No human runs kubectl apply in production: every change is a Git commit \ No newline at end of file diff --git a/scripts/gen_06_diagram.py b/scripts/gen_06_diagram.py index e9526fd8..2ffda1fd 100644 --- a/scripts/gen_06_diagram.py +++ b/scripts/gen_06_diagram.py @@ -6,11 +6,11 @@ g.emit("06-window-types", 880, 340, bands=[ {"x": 10, "y": 10, "w": 860, "h": 100, "fill": "#eef4fb", - "label": "Tumbling — fixed, no overlap"}, + "label": "Tumbling: fixed, no overlap"}, {"x": 10, "y": 120, "w": 860, "h": 100, "fill": "#fff8ef", - "label": "Hopping (sliding) — fixed, overlapping"}, + "label": "Hopping (sliding): fixed, overlapping"}, {"x": 10, "y": 230, "w": 860, "h": 100, "fill": "#fafafa", - "label": "Session — variable, gap-based"}, + "label": "Session: variable, gap-based"}, ], nodes=[ # Tumbling windows @@ -61,4 +61,4 @@ ], ) -print("Done — generated 06-window-types diagram") +print("Done: generated 06-window-types diagram") diff --git a/scripts/gen_07_diagram.py b/scripts/gen_07_diagram.py index 2732c3c0..28cea83c 100644 --- a/scripts/gen_07_diagram.py +++ b/scripts/gen_07_diagram.py @@ -41,4 +41,4 @@ ], ) -print("Done — generated 07-queue-worker diagram") +print("Done: generated 07-queue-worker diagram") diff --git a/scripts/gen_27_diagrams.py b/scripts/gen_27_diagrams.py index a523c8d4..3f1cfb04 100644 --- a/scripts/gen_27_diagrams.py +++ b/scripts/gen_27_diagrams.py @@ -23,7 +23,7 @@ ], notes=[ {"x": 460, "y": 250, "anchor": "middle", "color": "#2f6db5", - "text": "the services run on Docker Engine in CI as they do locally — no managed cloud — and a failed assertion fails the build"}, + "text": "the services run on Docker Engine in CI as they do locally: no managed cloud, and a failed assertion fails the build"}, ]) # ---- Figure O.3: one collection, six implementations ----------------------- @@ -50,5 +50,5 @@ ], notes=[ {"x": 460, "y": 40 + 56 * len(IMPLS) + 44, "anchor": "middle", "color": "#333", "bold": True, - "text": "because Newman tests the API as a black box, one collection validates every implementation — the contract is the spec, not the code"}, + "text": "because Newman tests the API as a black box, one collection validates every implementation: the contract is the spec, not the code"}, ]) diff --git a/scripts/gen_29_diagrams.py b/scripts/gen_29_diagrams.py index 8b28df1c..cdf6dbf5 100644 --- a/scripts/gen_29_diagrams.py +++ b/scripts/gen_29_diagrams.py @@ -3,7 +3,7 @@ import generate_diagram as g g.OUT = "../assets/diagrams" -# ── Figure P.1 — C# → CIL → Native compilation pipeline ────────────── +# ── Figure P.1: C# → CIL → Native compilation pipeline ────────────── g.emit("29-dotnet-compilation", 880, 340, bands=[ {"x": 10, "y": 10, "w": 860, "h": 320, "fill": "#fafafa", @@ -47,12 +47,12 @@ notes=[ {"x": 30, "y": 290, "text": "C# is one of several .NET languages (F#, VB.NET).", "size": 11, "color": "#888888"}, - {"x": 30, "y": 310, "text": "CIL = Common Intermediate Language — the CPU-agnostic bytecode all .NET languages compile to.", + {"x": 30, "y": 310, "text": "CIL = Common Intermediate Language: the CPU-agnostic bytecode all .NET languages compile to.", "size": 11, "color": "#888888"}, ], ) -# ── Figure P.2 — Kestrel request processing pipeline ───────────────── +# ── Figure P.2: Kestrel request processing pipeline ───────────────── g.emit("29-kestrel-pipeline", 880, 380, bands=[ {"x": 10, "y": 10, "w": 860, "h": 140, "fill": "#eef4fb", @@ -119,12 +119,12 @@ {"x1": 730, "y1": 208, "x2": 750, "y2": 208}, ], notes=[ - {"x": 30, "y": 370, "text": "Kestrel is the built-in cross-platform web server — no IIS, no Apache, no nginx required.", + {"x": 30, "y": 370, "text": "Kestrel is the built-in cross-platform web server: no IIS, no Apache, no nginx required.", "size": 11, "color": "#888888"}, ], ) -# ── Figure P.3 — Multi-stage container build ───────────────────────── +# ── Figure P.3: Multi-stage container build ───────────────────────── g.emit("29-container-layers", 880, 460, bands=[ {"x": 10, "y": 10, "w": 400, "h": 440, "fill": "#fff8ef", @@ -187,9 +187,9 @@ "size": 11, "color": "#888888"}, {"x": 30, "y": 395, "text": "and supported for production use.", "size": 11, "color": "#888888"}, - {"x": 30, "y": 425, "text": "The SDK never ships — only the runtime and your app DLLs.", + {"x": 30, "y": 425, "text": "The SDK never ships: only the runtime and your app DLLs.", "size": 11, "color": "#888888"}, ], ) -print("Done — generated 3 diagrams for Appendix P") +print("Done: generated 3 diagrams for Appendix P") diff --git a/scripts/gen_30_diagrams.py b/scripts/gen_30_diagrams.py index ae3b9b1d..4b363612 100644 --- a/scripts/gen_30_diagrams.py +++ b/scripts/gen_30_diagrams.py @@ -3,7 +3,7 @@ import generate_diagram as g g.OUT = "../assets/diagrams" -# ── Figure Q.1 — Blazor Server circuit ────────────────────────────────── +# ── Figure Q.1: Blazor Server circuit ────────────────────────────────── g.emit("30-blazor-circuit", 880, 340, bands=[ {"x": 10, "y": 10, "w": 330, "h": 320, "fill": "#eef4fb", @@ -63,7 +63,7 @@ ], ) -# ── Figure Q.2 — SignalR Redis backplane ──────────────────────────────── +# ── Figure Q.2: SignalR Redis backplane ──────────────────────────────── g.emit("30-signalr-backplane", 880, 310, bands=[ {"x": 10, "y": 10, "w": 560, "h": 190, "fill": "#eef4fb", @@ -81,7 +81,7 @@ "lines": ["blazor-pod-3", "0 circuits (new)"]}, # Load balancer {"x": 30, "y": 140, "w": 510, "h": 40, "style": "kernel", - "lines": ["Kubernetes Service / load balancer — sticky per circuit"]}, + "lines": ["Kubernetes Service / load balancer: sticky per circuit"]}, # Redis {"x": 620, "y": 55, "w": 220, "h": 55, "style": "ink", "lines": ["Redis", "SignalR backplane"]}, @@ -112,4 +112,4 @@ ], ) -print("Done — generated 2 diagrams for Appendix Q") +print("Done: generated 2 diagrams for Appendix Q") diff --git a/scripts/gen_31_diagrams.py b/scripts/gen_31_diagrams.py index 81319f52..98654983 100644 --- a/scripts/gen_31_diagrams.py +++ b/scripts/gen_31_diagrams.py @@ -3,7 +3,7 @@ import generate_diagram as g g.OUT = "../assets/diagrams" -# ── Figure R.1 — cluster topology and host access ─────────────────────── +# ── Figure R.1: cluster topology and host access ─────────────────────── g.emit("31-minikube-topology", 880, 420, bands=[ {"x": 10, "y": 10, "w": 200, "h": 400, "fill": "#eef4fb", @@ -54,7 +54,7 @@ ], ) -# ── Figure R.2 — image flow ───────────────────────────────────────────── +# ── Figure R.2: image flow ───────────────────────────────────────────── g.emit("31-minikube-image-flow", 880, 300, bands=[ {"x": 10, "y": 10, "w": 540, "h": 190, "fill": "#eef4fb", @@ -86,4 +86,4 @@ ], notes=[], ) -print("Done — generated 2 diagrams for Appendix R") +print("Done: generated 2 diagrams for Appendix R") diff --git a/scripts/gen_32_diagrams.py b/scripts/gen_32_diagrams.py index 4147fe7a..1bdbe97f 100644 --- a/scripts/gen_32_diagrams.py +++ b/scripts/gen_32_diagrams.py @@ -3,7 +3,7 @@ import generate_diagram as g g.OUT = "../assets/diagrams" -# ── Figure S.1 — cluster topology and host access ─────────────────────── +# ── Figure S.1: cluster topology and host access ─────────────────────── g.emit("32-openshift-topology", 880, 440, bands=[ {"x": 10, "y": 10, "w": 200, "h": 420, "fill": "#eef4fb", @@ -57,7 +57,7 @@ ], ) -# ── Figure S.2 — image flow ───────────────────────────────────────────── +# ── Figure S.2: image flow ───────────────────────────────────────────── g.emit("32-openshift-image-flow", 880, 320, bands=[ {"x": 10, "y": 10, "w": 540, "h": 210, "fill": "#eef4fb", @@ -93,4 +93,4 @@ ], notes=[], ) -print("Done — generated 2 diagrams for Appendix S") +print("Done: generated 2 diagrams for Appendix S") diff --git a/scripts/generate_example_diagrams.py b/scripts/generate_example_diagrams.py index 15a65546..852b3d63 100644 --- a/scripts/generate_example_diagrams.py +++ b/scripts/generate_example_diagrams.py @@ -485,4 +485,4 @@ def gen_28(): gen_06(); gen_09(); gen_11(); gen_12(); gen_16() gen_17(); gen_18(); gen_19(); gen_21(); gen_22() gen_24(); gen_25(); gen_26(); gen_27(); gen_28() - print("Done — 20 diagrams generated.") + print("Done: 20 diagrams generated.")