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 @@
\ 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 processesrun 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 / Pulsarasync
-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 @@
\ 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 queryread-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 @@
queriesqueries
-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 schemaCloudNativePG
-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 / expirenack / 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 @@
resumeresume
-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 @@
\ 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 Tpast 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 @@
consumeconsume
-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 bridgethe 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 logProducerskeyed 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 0head (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 · segmentsTiered storage
-object store — cold
+object store: coldConsumersexclusive / 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 refundthen 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 logicno broker client
@@ -31,5 +31,5 @@
consume / produceconsume / 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 stateaggregate state = fold(events from t0)the event log is the database
@@ -11,7 +11,7 @@
fit: audit-heavy, financial, temporal querieswhere: Marten · EventStoreDB · Axon
-Event streaming — events are the transport
+Event streaming: events are the transportcurrent state lives in a databaseevents are facts emitted about changes
@@ -20,6 +20,6 @@
fit: integration, fan-out, decoupling teamswhere: 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 projectionsask: 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 @@
replayreplay
-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 & outtypical 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-basedWindow 100: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 KEDAimage resize, emailoff 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)sagaorchestrator
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 productRuntime planegateway + 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 classificationaccountable ownercompliance-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 · ownersingestingest
@@ -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 @@
keptkept
-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 / Parcacorrelated 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 @@
Lokifilter 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-servicePOST /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 → notifytime →
-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 boundedWithout bulkheadsWith 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 adminCluster · RBAC · NetworkPolicy · Pod Security · admissionContainer · minimal image · non-root · read-only FS · signedCode · 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 @@
loadedloaded
-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 @@
localhostlocalhost
-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 hopStorage / KMSvalidates the token,
@@ -28,5 +28,5 @@
4. validate4. 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 trivialZero-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 hopsNo contract · leaky internal models
@@ -25,6 +25,6 @@
-anti-pattern — coupling sneaking back in
+anti-pattern: coupling sneaking back inthe 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 everywhereShared database
-two services, one schema —
+two services, one schema :coupled deploys and blast radiusChatty / N+1 APIs
@@ -36,5 +36,5 @@
Leaky internal modelsDB rows exposed as thepublic 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 fieldsclient
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 independentlyClient
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: resourcesnouns + HTTP verbsPOST /orders
@@ -9,7 +9,7 @@
state transferserver defines payload
-gRPC — procedures
+gRPC: procedurestyped method callsOrder.Place(req)
@@ -17,7 +17,7 @@
behaviour, not statecontract = .proto
-GraphQL — a graph
+GraphQL: a graphone typed schemaquery { 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 safeDEPRECATEreason · 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 compatibleadd a field with a new numberadd a new rpc methodadd 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 gatechange a field's number or typereuse a removed field numberremove a field without reservedchange unary ↔ streaming on an rpcrename or move a service / packagechange 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 breakingwire 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 @@
subsub
-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 seqtreat 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 problemnew pod gets no existing
-connections — only new ones
+connections: only new onesscale-down / rolloutkilling 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 stepscharge_payment
@@ -22,5 +22,5 @@
reverse orderreverse 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 Bcrash 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 data1. call A1. 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 retrygoogle.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 triesafter 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 errorfix the request; do not retry as-is
-429 / 503 — busy
+429 / 503: busyback off; honour the Retry-After header
-5xx — server error
+5xx: server errorretry idempotent calls with backoffapplication/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 loopThe controls that break the loop
@@ -35,5 +35,5 @@
more timeoutsmore timeoutseach 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, sparinglyPartnership
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 coreREST adapter
@@ -28,6 +28,6 @@
outbound portoutbound port
-dependencies point inward — adapters depend on the domain, never the reverse
+dependencies point inward: adapters depend on the domain, never the reverseadd 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-shelfe.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'sthe 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 ↓)Nameagree 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: healthykeep it localDistributed monolith
-strong + distant — the trap
+strong + distant: the trapone change ripples across servicesNeedless indirection
@@ -22,5 +22,5 @@
closedistant← 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 · respondLoose & reversiblefavour 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 subdomaincost 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 newfinish in-flight requestsbounded by a timeout
-— the one that's automatic
+the one that's automaticKafka consumerstop polling
@@ -17,7 +17,7 @@
send a close / go-awayclients reconnect elsewherelean on seq + backplane
-— Appendix C
+Appendix CJobs / schedulerdon't start new work
@@ -26,6 +26,6 @@
resume after restartmake 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 safestop 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 @@
triggerstriggersreadiness 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 drainingtime →
\ 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 mustpay 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 → backendheader → canary, version, userinject / 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 meshClient
@@ -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 requestload is evenclient state lives elsewhere
-— the preferred default
+the preferred defaultCookie-basedLB 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 @@
Shadowcopy traffic to v2test 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 throughoutClientsone URL
@@ -22,5 +22,5 @@
defaultdefaultstep 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 processOrders 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 costpromoting 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 toodecorator 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 deployableOrders modulepublic API only
@@ -27,5 +27,5 @@
One database, separate schemasorders.* / 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 deployableAuth
@@ -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 routesfuture 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 agreemove 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 SET2 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 → 279 → 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 attackbreak 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 codeCaller+ sidecar
@@ -17,5 +17,5 @@
outlier → ejectoutlier → 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 decisionper dependency
-Inventory — healthy
+Inventory: healthyuse the result
-Payment — down
+Payment: downfall back / fail
-Shipping — slow
+Shipping: slowtime 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✕ partitionboth 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 left500 leftthe 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 deployBuild & deployflag 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 @@
rulesrules
-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 downthe 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-ownedsplit variants, measure the metric
-temporary — ends when the test ends
+temporary: ends when the test ends→ sticky bucketing requiredOps / kill-switch · SRE-owneddisable a feature or dependency FAST
-long-lived — a permanent control
+long-lived: a permanent control→ pairs with circuit breakersPermission / entitlement · productgate by plan, tier, or region
-long-lived — part of the product model
+long-lived: part of the product model→ targeting rules, not a rolloutshort-lived ← lifetime → long-livedwho 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 runresolved 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 @@
resultsresults
-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 hereService / 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 redistributableand 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 @@
usesusesC# 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-30 circuits (new)
-Kubernetes Service / load balancer — sticky per circuit
+Kubernetes Service / load balancer: sticky per circuitRedisSignalR 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 stagesCODEOWNERS enforces: platform-baselines → firewall review, app-policies → platform reviewFail 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 @@
templatestemplates
-Policy ownership model — who authors, who reviews, who approves
+Policy ownership model: who authors, who reviews, who approvesGatekeeper → architectKeeps north-south edgeControls 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 tierAdmin tier evaluatescluster-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 stagesFail 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 detectionGitOps 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.")