diff --git a/blog/deciding-well-solved/og.sha b/blog/deciding-well-solved/og.sha
index c5cbdab..15aca41 100644
--- a/blog/deciding-well-solved/og.sha
+++ b/blog/deciding-well-solved/og.sha
@@ -1 +1 @@
-31822d50f0f211896bf967d08e76e9ec0616d164badc62057eb12106e5be434b
+6535f8b21c3602a1b317ff70b6fa4e7f43b5fd622aca9e0c0e04c78851336d80
diff --git a/blog/og.sha b/blog/og.sha
index 859d6a1..72a11eb 100644
--- a/blog/og.sha
+++ b/blog/og.sha
@@ -1 +1 @@
-5401b30118574120ec7e075c9da15f75e70798127fa715d4be56c4dc7b6f2d16
+b276dbe150c4de571fe6437f09b4f3e32e9061e804bd02fbe81f6a27f72d8816
diff --git a/blog/one-question-answered/og.sha b/blog/one-question-answered/og.sha
index 15b050f..0e9a520 100644
--- a/blog/one-question-answered/og.sha
+++ b/blog/one-question-answered/og.sha
@@ -1 +1 @@
-2eb8fcd132c2d3a1f4187d7a147f70dc204e623f8c3cf865bec5e369fbf57e98
+a2110254675a84d80f24d22812f89551827e0c180e3162110164be92d72137c9
diff --git a/chat.css b/chat.css
index 19768ad..f78c782 100644
--- a/chat.css
+++ b/chat.css
@@ -213,12 +213,15 @@ html[data-chat-waiting]::after{content:"ask \00b7 " attr(data-chat-waiting);pos
sized to the text; a person's mark is the firm brightness and an agent's the mid, as the
Processes page draws them, and both beat the linked label's own color; a system's element mark
is the firm brightness too, since a system is a thing and not an agent. An open position is a
- dashed box with no fill, and the frame the agents of a group stand in is shaded. */
+ dashed box with no fill, as is a scenario's extension, and the frame the agents of a group
+ stand in is shaded. */
.rbchat-diagram-box svg .label-icon{width:1.15em;height:1.15em;vertical-align:-.2em;margin-right:.3em}
.rbchat-diagram-box svg .rbchat-mark.human{color:var(--c-firm,var(--ink))!important}
.rbchat-diagram-box svg .rbchat-mark.agent{color:var(--c-mid)!important}
+.rbchat-diagram-box svg .rbchat-mark.actor{color:var(--c-firm,var(--ink))!important}
.rbchat-diagram-box svg .rbchat-mark.element{color:var(--c-firm,var(--ink))!important}
.rbchat-diagram-box svg .node.open rect{fill:none!important}
+.rbchat-diagram-box svg .node.ext rect{fill:none!important}
.rbchat-diagram-box svg .cluster.agents rect{fill:var(--press)!important}
.rbchat-diagram-reading{margin:.35rem .1rem 0;font-size:.8rem;line-height:1.4;color:var(--dim)}
/* A page's own picture is a preview: fitted to the column, never past its own size, and
diff --git a/chat.js b/chat.js
index e8e2aee..23b70db 100644
--- a/chat.js
+++ b/chat.js
@@ -129,7 +129,7 @@
github: "{title} on GitHub", commit: "commit {sha}",
modalClose: "Close \u00b7 Esc",
ask: { from: "The link you opened asks:", label: "A question from the link you opened", send: "Send", edit: "Edit", discard: "Discard" },
- diagram: { concepts: "Concepts", process: "Process", neighborhood: "Connections", schema: "Meta-model", context: "Context map", aggregate: "Aggregate", flow: "Flow", lifecycle: "Lifecycle", organization: "Organization", system: "Landscape", holds: "Data held", reading: { context: "One-way arrows run from upstream to downstream; each arrow names the pattern between the two contexts.", aggregate: "The root holds what the diamonds join; the dashed arrows are the events it emits.", flow: "Solid arrows are commands sent to the aggregate, dashed arrows the events it emits; a box names the condition of each branch.", lifecycle: "Each arrow is a step from one state to the next, labeled with the command that takes it where there is one.", organization: "Solid arrows run from a lead to the leads below; a dashed line joins staff to the head they serve; a dashed box is an open position, beside a lead the search for a successor; agents stand in the shaded frame, and a dotted arrow from a person to an agent says who directs it, where an agent with no arrow is directed by everyone in the frame.", system: "Solid arrows run from the system the data comes from to the one that takes it, labeled with the interface, what is carried and how; a dotted line joins a system to what it runs on; a rounded box is a service the system provides; a cylinder is data it holds, by a heavy arrow where its copy leads, a solid one where it writes and a dotted one where it only reads.", holds: "Each cylinder is data kept of the concept named under it; a heavy arrow marks the system whose copy leads, a solid one a system that writes a copy of its own, a dotted one a system that only reads." }, expand: "Open full screen", shut: "Close full screen", zoomIn: "Zoom in", zoomOut: "Zoom out", fit: "Fit", fitTip: "Fit to the screen", failed: "The diagram could not be drawn; this is its source." },
+ diagram: { concepts: "Concepts", process: "Process", neighborhood: "Connections", schema: "Meta-model", context: "Context map", aggregate: "Aggregate", flow: "Flow", lifecycle: "Lifecycle", organization: "Organization", system: "Landscape", holds: "Data held", usecase: "Use case", scenario: "Scenario", requirements: "Requirements", reading: { context: "One-way arrows run from upstream to downstream; each arrow names the pattern between the two contexts.", aggregate: "The root holds what the diamonds join; the dashed arrows are the events it emits.", flow: "Solid arrows are commands sent to the aggregate, dashed arrows the events it emits; a box names the condition of each branch.", lifecycle: "Each arrow is a step from one state to the next, labeled with the command that takes it where there is one.", organization: "Solid arrows run from a lead to the leads below; a dashed line joins staff to the head they serve; a dashed box is an open position, beside a lead the search for a successor; agents stand in the shaded frame, and a dotted arrow from a person to an agent says who directs it, where an agent with no arrow is directed by everyone in the frame.", system: "Solid arrows run from the system the data comes from to the one that takes it, labeled with the interface, what is carried and how; a dotted line joins a system to what it runs on; a rounded box is a service the system provides; a cylinder is data it holds, by a heavy arrow where its copy leads, a solid one where it writes and a dotted one where it only reads.", holds: "Each cylinder is data kept of the concept named under it; a heavy arrow marks the system whose copy leads, a solid one a system that writes a copy of its own, a dotted one a system that only reads.", usecase: "The actor stands outside the frame, which is the use case's scope; a dashed arrow runs from a use case to one its steps include, a solid one to a feature it asks something of; a hexagon is a requirement it is held to, with a heavy border where it must and a dashed one where it may.", scenario: "The rounded box is the trigger; each box is a step, in order, with who acts; a dashed box is an extension, the condition first and what happens then.", requirements: "A hexagon is a requirement, with a heavy border where it must and a dashed one where it may, in a frame for its kind; an arrow runs to what it applies to, a dotted one to a rule it follows." }, expand: "Open full screen", shut: "Close full screen", zoomIn: "Zoom in", zoomOut: "Zoom out", fit: "Fit", fitTip: "Fit to the screen", failed: "The diagram could not be drawn; this is its source." },
refusal: {
too_long: "That message is over 1,000 characters.",
too_much: "The conversation has grown too long to send; start a new one.",
@@ -177,7 +177,7 @@
github: "{title} auf GitHub", commit: "Commit {sha}",
modalClose: "Schliessen \u00b7 Esc",
ask: { from: "Der Link, den Sie geöffnet haben, enthält diese Frage:", label: "Eine Frage aus dem Link, den Sie geöffnet haben", send: "Senden", edit: "Bearbeiten", discard: "Verwerfen" },
- diagram: { concepts: "Konzepte", process: "Prozess", neighborhood: "Verbindungen", schema: "Meta-Modell", context: "Context Map", aggregate: "Aggregat", flow: "Ablauf", lifecycle: "Lebenszyklus", organization: "Organisation", system: "Landschaft", holds: "Datenbestand", reading: { context: "Einfache Pfeile laufen vom Upstream- zum Downstream-Kontext; jeder Pfeil nennt das Muster zwischen den beiden Kontexten.", aggregate: "Die Wurzel des Aggregats hält, was die Rauten verbinden; die gestrichelten Pfeile sind die Ereignisse, die sie auslöst.", flow: "Durchgezogene Pfeile sind Befehle an das Aggregat, gestrichelte die Ereignisse, die es auslöst; ein Kasten nennt die Bedingung jedes Zweigs.", lifecycle: "Jeder Pfeil ist ein Schritt von einem Zustand zum nächsten, beschriftet mit dem Befehl, der ihn auslöst, wo es einen gibt.", organization: "Durchgezogene Pfeile laufen von einer Führungskraft zu den Führungskräften darunter; eine gestrichelte Linie verbindet eine Stabsstelle mit der Leitung, der sie zuarbeitet; ein gestrichelter Kasten ist eine offene Stelle, neben einer Führungskraft die Suche nach ihrer Nachfolge; Software-Agenten stehen im farbig hinterlegten Rahmen, und ein gepunkteter Pfeil von einer Person zu einem Agenten sagt, wer ihn steuert; ein Agent ohne Pfeil wird von allen im Rahmen gesteuert.", system: "Durchgezogene Pfeile laufen vom System, aus dem die Daten stammen, zum System, das sie übernimmt, beschriftet mit der Schnittstelle und mit dem, was übertragen wird und wie; eine gepunktete Linie verbindet ein System mit dem, worauf es läuft; ein abgerundeter Kasten ist ein Service, den das System bereitstellt; ein Zylinder ist ein Datenbestand, den es hält – mit einem dicken Pfeil, wo seine Kopie führend ist, einem durchgezogenen, wo es schreibt, und einem gepunkteten, wo es nur liest.", holds: "Jeder Zylinder ist ein Datenbestand zum darunter genannten Konzept; ein dicker Pfeil markiert das System, dessen Kopie führend ist, ein durchgezogener ein System, das eine eigene Kopie schreibt, ein gepunkteter ein System, das nur liest." }, expand: "Im Vollbild öffnen", shut: "Vollbild schliessen", zoomIn: "Vergrössern", zoomOut: "Verkleinern", fit: "Einpassen", fitTip: "Auf den Bildschirm einpassen", failed: "Das Diagramm konnte nicht gezeichnet werden; dies ist seine Quelle." },
+ diagram: { concepts: "Konzepte", process: "Prozess", neighborhood: "Verbindungen", schema: "Meta-Modell", context: "Context Map", aggregate: "Aggregat", flow: "Ablauf", lifecycle: "Lebenszyklus", organization: "Organisation", system: "Landschaft", holds: "Datenbestand", usecase: "Anwendungsfall", scenario: "Szenario", requirements: "Anforderungen", reading: { context: "Einfache Pfeile laufen vom Upstream- zum Downstream-Kontext; jeder Pfeil nennt das Muster zwischen den beiden Kontexten.", aggregate: "Die Wurzel des Aggregats hält, was die Rauten verbinden; die gestrichelten Pfeile sind die Ereignisse, die sie auslöst.", flow: "Durchgezogene Pfeile sind Befehle an das Aggregat, gestrichelte die Ereignisse, die es auslöst; ein Kasten nennt die Bedingung jedes Zweigs.", lifecycle: "Jeder Pfeil ist ein Schritt von einem Zustand zum nächsten, beschriftet mit dem Befehl, der ihn auslöst, wo es einen gibt.", organization: "Durchgezogene Pfeile laufen von einer Führungskraft zu den Führungskräften darunter; eine gestrichelte Linie verbindet eine Stabsstelle mit der Leitung, der sie zuarbeitet; ein gestrichelter Kasten ist eine offene Stelle, neben einer Führungskraft die Suche nach ihrer Nachfolge; Software-Agenten stehen im farbig hinterlegten Rahmen, und ein gepunkteter Pfeil von einer Person zu einem Agenten sagt, wer ihn steuert; ein Agent ohne Pfeil wird von allen im Rahmen gesteuert.", system: "Durchgezogene Pfeile laufen vom System, aus dem die Daten stammen, zum System, das sie übernimmt, beschriftet mit der Schnittstelle und mit dem, was übertragen wird und wie; eine gepunktete Linie verbindet ein System mit dem, worauf es läuft; ein abgerundeter Kasten ist ein Service, den das System bereitstellt; ein Zylinder ist ein Datenbestand, den es hält – mit einem dicken Pfeil, wo seine Kopie führend ist, einem durchgezogenen, wo es schreibt, und einem gepunkteten, wo es nur liest.", holds: "Jeder Zylinder ist ein Datenbestand zum darunter genannten Konzept; ein dicker Pfeil markiert das System, dessen Kopie führend ist, ein durchgezogener ein System, das eine eigene Kopie schreibt, ein gepunkteter ein System, das nur liest.", usecase: "Der Rahmen ist der Geltungsbereich des Anwendungsfalls, und der Akteur steht ausserhalb; ein gestrichelter Pfeil läuft von einem Anwendungsfall zu einem anderen, den seine Schritte einbinden, ein durchgezogener zu einem Feature, von dem er etwas verlangt; ein Sechseck ist eine Anforderung, die für den Anwendungsfall gilt, mit dickem Rand, wo sie «muss» sagt, und gestricheltem, wo sie «darf» sagt.", scenario: "Der abgerundete Kasten ist der Auslöser; die Kästen sind die Schritte in ihrer Reihenfolge, und jeder nennt, wer handelt; ein gestrichelter Kasten ist eine Erweiterung: zuerst die Bedingung, dann, was geschieht.", requirements: "Ein Sechseck ist eine Anforderung, mit dickem Rand, wo sie «muss» sagt, und gestricheltem, wo sie «darf» sagt; der Rahmen um sie nennt ihre Art; ein Pfeil läuft zu dem, wofür sie gilt, ein gepunkteter zu einer Regel, der sie folgt." }, expand: "Im Vollbild öffnen", shut: "Vollbild schliessen", zoomIn: "Vergrössern", zoomOut: "Verkleinern", fit: "Einpassen", fitTip: "Auf den Bildschirm einpassen", failed: "Das Diagramm konnte nicht gezeichnet werden; dies ist seine Quelle." },
refusal: {
too_long: "Diese Nachricht ist länger als 1’000 Zeichen.",
too_much: "Das Gespräch ist zu lang geworden, um es zu senden; beginnen Sie ein neues.",
@@ -787,10 +787,11 @@
};
}
// Where Mermaid put a node in its SVG: a group whose id ends in the node's name and a number,
- // after `classId` in a class diagram and `flowchart` in a flowchart. The one place that knows
+ // after `classId` in a class diagram and `flowchart` in a flowchart; a scenario's step is `s0`
+ // and on and is listed where its actor is a seat. The one place that knows
// it, so a Mermaid release that names them otherwise is fixed here and nowhere else.
function nodeElement(svg, node){
- if (!svg || !/^n\d+$/.test(String(node))) return null;
+ if (!svg || !/^[ns]\d+$/.test(String(node))) return null;
var re = new RegExp("-(?:classId|flowchart)-" + node + "-\\d+$"), all = svg.querySelectorAll("g[id]");
for (var i = 0; i < all.length; i++) if (re.test(all[i].id)) return all[i];
return null;
@@ -926,6 +927,7 @@
var MARKS = {
human: '',
agent: '',
+ actor: '',
"application-component": '',
node: '',
"system-software": '',
@@ -936,7 +938,7 @@
function withMarks(m){
if (m && typeof m.registerIconPacks === "function" && !m.rbMarks) {
var icons = {};
- Object.keys(MARKS).forEach(function(k){ icons[k] = { body: '' + MARKS[k] + "" }; });
+ Object.keys(MARKS).forEach(function(k){ icons[k] = { body: '' + MARKS[k] + "" }; });
m.registerIconPacks([{ name: "fak", icons: { prefix: "fak", width: 16, height: 16, icons: icons } }]);
m.rbMarks = true;
}
diff --git a/ideas/og.sha b/ideas/og.sha
index 4ad47bd..94e6bd1 100644
--- a/ideas/og.sha
+++ b/ideas/og.sha
@@ -1 +1 @@
-28ad7f22d50615789c19a779386ab7656f390768102d64cc649b251ebd9e8c4a
+a45e7c0933de69896b1392ca5837271000140f124031dc00b8d5dd86c84ab359
diff --git a/model/og.sha b/model/og.sha
index 557120b..10f583d 100644
--- a/model/og.sha
+++ b/model/og.sha
@@ -1 +1 @@
-8d6cb726ee056f2b1564d0f668d3f39bcf2a90bb3e6af450b2689e3818eaa27c
+59f3901f8d7def8cc96f3afb7fce56362d56db4c573ce868162096842ec9aa7e
diff --git a/og.sha b/og.sha
index 8b1f093..22a3956 100644
--- a/og.sha
+++ b/og.sha
@@ -1 +1 @@
-163f10abb9c77a1f8b0560f62187fdd68fcb9f830558b6ea55e570175ac230b7
+8b1242c11c39f2af81ff4086eac33d0a7d9117234b74312b38373cccb1f5ec48
diff --git a/package-lock.json b/package-lock.json
index 2aed9f2..f69c099 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
"companygraph-meta-model": "github:companygraph/meta-model#v0.88.0"
},
"devDependencies": {
- "@robertblust/design": "github:robertblust/design#v0.150.0",
+ "@robertblust/design": "github:robertblust/design#v0.151.0",
"companygraph-mcp-server": "github:companygraph/mcp-server#v0.62.0",
"pdf-lib": "^1.17.1",
"playwright": "^1.63.0"
@@ -95,8 +95,8 @@
}
},
"node_modules/@robertblust/design": {
- "version": "0.150.0",
- "resolved": "git+ssh://git@github.com/robertblust/design.git#63044b26ec57d169d7bb91a5de8fd12ee4b78881",
+ "version": "0.151.0",
+ "resolved": "git+ssh://git@github.com/robertblust/design.git#65b78c6310af99370e594d48de0f8bff6a682448",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/package.json b/package.json
index a5b1a1e..e2949b2 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"pin:check": "node pin-check.mjs"
},
"devDependencies": {
- "@robertblust/design": "github:robertblust/design#v0.150.0",
+ "@robertblust/design": "github:robertblust/design#v0.151.0",
"companygraph-mcp-server": "github:companygraph/mcp-server#v0.62.0",
"pdf-lib": "^1.17.1",
"playwright": "^1.63.0"
diff --git a/principles/og.sha b/principles/og.sha
index 1612ef2..0aa4af5 100644
--- a/principles/og.sha
+++ b/principles/og.sha
@@ -1 +1 @@
-32f96a35179035dac90e094ea9e2b7377b492424f3a1de2a8e49d3b2f732ad01
+42955012ca6c878dd69060ca9c1e68bb2468772b466f9d64c0ab37a729475b2f
diff --git a/privacy/og.sha b/privacy/og.sha
index 2f75533..99ca16d 100644
--- a/privacy/og.sha
+++ b/privacy/og.sha
@@ -1 +1 @@
-852c558b98a55cf37d350ac879e86a9b5e561a4522678dee67258a05fe5de6ba
+0e13741d69c435819396ead21b1959c4287f4b10110a456fcf480a05aefe7189
diff --git a/processes/og.sha b/processes/og.sha
index eda8092..29ba182 100644
--- a/processes/og.sha
+++ b/processes/og.sha
@@ -1 +1 @@
-3e5f135ad5bd66cc2e6b655555babd4fd8ae859279507286f047fda4f4c53298
+dedce63da4e00e008ba810ba8f9caf0eb00350ee525616dcafe1ed0d33e246fe
diff --git a/processes/pictures/answering.sha b/processes/pictures/answering.sha
index 48781cc..c62283d 100644
--- a/processes/pictures/answering.sha
+++ b/processes/pictures/answering.sha
@@ -1 +1 @@
-4decf2a5b45e907bf64043674e33cd19047a7ef89a294ce8abb2ba4e553efa00
+983410cae0321568b610f7252d21bd21e4d93de12c4d14389e5ffb89d5145dfc
diff --git a/processes/pictures/deciding.sha b/processes/pictures/deciding.sha
index 51b64f2..b42a0ca 100644
--- a/processes/pictures/deciding.sha
+++ b/processes/pictures/deciding.sha
@@ -1 +1 @@
-12ed3fe08c05bbfe7b8be83b0d34f9c75b0998542680c8e1a9d508b85b913635
+58f51103b3115901c9401849dcbf462b5d99dea686176d719d0539ccb279a6b5
diff --git a/processes/pictures/delivery.sha b/processes/pictures/delivery.sha
index d7bf7d2..8a254dc 100644
--- a/processes/pictures/delivery.sha
+++ b/processes/pictures/delivery.sha
@@ -1 +1 @@
-04839431a9ead9aa3e9abf4a055eee1282eb4abcedfcffcdb46cf00415ae87ac
+9fc548f92799b2c56496b006b9a28ccebda77270a21fe9d79527d58fdb6d41e4
diff --git a/processes/pictures/narrating.sha b/processes/pictures/narrating.sha
index 7204151..daec858 100644
--- a/processes/pictures/narrating.sha
+++ b/processes/pictures/narrating.sha
@@ -1 +1 @@
-cb0636faf363d2782f1a70cba79aed40a1da7cd5acdc15a024e7c0d4d08b2479
+07fb096f6356c1f4d67726eaf58ea87a0fba340ce3d66e9917bb5e98b2f6abd4
diff --git a/surfaces/og.sha b/surfaces/og.sha
index b5ee2b3..23aee86 100644
--- a/surfaces/og.sha
+++ b/surfaces/og.sha
@@ -1 +1 @@
-b2f3b876e76e4bebf605e3bc16a5961236022309bb274402add0055cff5b8698
+e7982335e944f4791e8dd048a75ca1588935b742b60907f117b93cf93c447021
diff --git a/talks/deciding-well/cost/og.sha b/talks/deciding-well/cost/og.sha
index d870562..cf294eb 100644
--- a/talks/deciding-well/cost/og.sha
+++ b/talks/deciding-well/cost/og.sha
@@ -1 +1 @@
-9e72555ec91b2e6e3a99fd128d0e4f207a1102c309228075e27d0876d5aa216c
+dfe15cb76be838c286cbdcca63117fdc96dfe92d774cdf897ddc0aad2d319130
diff --git a/talks/deciding-well/og.sha b/talks/deciding-well/og.sha
index 5750d64..e460e5a 100644
--- a/talks/deciding-well/og.sha
+++ b/talks/deciding-well/og.sha
@@ -1 +1 @@
-e3ab0ee2d447c245c220f76b1136d834be2e329ad06b9abc9131028c41178b29
+a7b2b62438312a253c3e2788070ba78a4bfae93931b6909c779ac30028f1cf87
diff --git a/talks/essential-complexity/og.sha b/talks/essential-complexity/og.sha
index a2c4723..8b265c2 100644
--- a/talks/essential-complexity/og.sha
+++ b/talks/essential-complexity/og.sha
@@ -1 +1 @@
-bccbcbbcde954968c4e771367723d10a5816756534f6304712a7ad1462e070e4
+787f18dbecc01675e9188d4cd690c496d674949738d450542c302a1b623764f0
diff --git a/talks/mental-model/og.sha b/talks/mental-model/og.sha
index efa488c..7f5f5e2 100644
--- a/talks/mental-model/og.sha
+++ b/talks/mental-model/og.sha
@@ -1 +1 @@
-e0b17f053c4279ccc064867a0d5d2275818530646cefa0f5858dc222fbe39e02
+acbbaad2438bfecfe2d25dbc0d92bc0331a566b60ea37542c47e65c7801f58de
diff --git a/talks/og.sha b/talks/og.sha
index 819a8c5..3c6cb98 100644
--- a/talks/og.sha
+++ b/talks/og.sha
@@ -1 +1 @@
-fc6568eff0361077e12355690a1c01bbc7ceb75b8565285b0d43a3e108dba3b7
+019e79880def52d2940c46b0c9d9990de1460044c7b28be2be40f0e2e6ed0e32
diff --git a/timeline/og.sha b/timeline/og.sha
index e070279..0167df0 100644
--- a/timeline/og.sha
+++ b/timeline/og.sha
@@ -1 +1 @@
-57d282cd500d814c066933cadf67d6729e11a2b2d180a974e98d2b1a299a8a8d
+f4d1d31e154b9879ae9b8ab87709373701c1e960c2f6ac09d33905f219ec63c3