· design / rfc / release
spec 1.8 リリース — 1 view に複数 seq を並べる
TL;DR
view report @sequence_diagram { seq success { ... } seq failure { ... } }— 同じ participants の上で複数シナリオを 1 view に集約できる- レンダラは縦に積み、
« seq: <name> »ヘッダ + 横点線で区切る。**lifeline は view 全体で共有** - 2+ ブロック時は各ブロックに名前必須・重複禁止 (lint L057)
- VS Code 0.9.0 /
@umlay/cli@0.8.0と同時リリース。 既存の単一seq { ... }は完全に動く (1 ピクセル変化なし)
動機 — 「success と failure を見比べたい」
1 つのフローについて「正常系・異常系・キャンセル系」を別々の view に 書くと、レビュー時に複数タブを行き来しないと比較できません。 spec 1.7 までは 1 view = 1 シーケンス本体しか持てなかったため、 PM やインシデント担当者が「ハッピーパスとエラーパスを 1 枚に」と 言うたびに、participants をコピペした別 view を作る必要がありました。
spec 1.8 (RFC 0053) は、これを 「同じ view に複数の `seq` ブロックを書ける」で解消します。
構文
namespace ops
view report @sequence_diagram
@intent("注文確定の主要パス・失敗パス・キャンセルを 1 枚に集約") {
participants:
Customer as c,
OrderService as svc,
OrderDao as dao,
OrderEntity as ord,
Notifier as notify
seq success {
c ->> svc : "confirm(orderId)"
svc ->> dao : "save(order)"
dao ->> ord : "insert"
dao -.> svc : "Order"
svc ->> notify : "OrderConfirmed"
svc -.> c : "ConfirmedOrder"
}
seq failure {
c ->> svc : "confirm(orderId)"
svc ->> dao : "save(order)"
dao -.> svc : "DBError"
svc ->> notify : "alert(opsTeam)"
svc -.> c : "503 ServiceUnavailable"
}
seq cancel {
c ->> svc : "cancel(orderId)"
svc ->> dao : "delete(orderId)"
dao ->> ord : "remove"
svc ->> notify : "OrderCancelled"
svc -.> c : "CancelAck"
}
}レンダリング結果
1 枚の SVG に 3 セクションが縦に積まれます。各セクションの上に « seq: success » / « seq: failure » / « seq: cancel » のヘッダ + 横点線。participants は view 全体で共有 (上下の箱は 1 セット、ライフラインは図の最下端まで縦に通る)。 ステップ番号は通し番号 (1〜16) で全シナリオを横断します。

運用ルール
- 2 つ以上の `seq` を入れる場合は名前必須 — lint L057 が無名ブロックを検出して info / warning / error に
- 名前は同 view 内で一意 (重複も L057)
- 1 ブロックだけなら 無名でも命名でも OK — 旧
seq { ... }は無変更で動作 participants:は view レベルで 1 度宣言して全 seq が共有
いつ複数 `seq` vs 別 view にすべきか
| 観点 | 複数 `seq` を 1 view | 別 view |
|---|---|---|
| 同じ participants が登場 | ✅ ライフライン共有 | — |
| 別の participants 集合 | — | ✅ |
| 対比して読ませたい | ✅ (success vs failure) | — |
| View Selector で個別フィルタ | — | ✅ |
| 1 ページに収めたい (印刷 / PR) | ✅ | — |
VS Code 0.9.0 への反映
- tmLanguage 更新 —
seqをキーワードとして強調、seq <name>の name 部分をentity.name.section.seq.umlayとして色分け - Document mode の Views TOC — 名前付き seq ブロックをサブエントリとして列挙、 クリック → 該当宣言にジャンプ
- SVG プレビュー — renderer-er 経由で自動的に新挙動 (縦積み + ヘッダ + 共有ライフライン)
後方互換性
IR には View.sequenceBodies?: SequenceBody[] と SequenceBody.name?: string を追加しました。既存の View.sequenceBody? は sequenceBodies[0] の alias として 残しているため、1.7 以前の IR コンシューマー (codegen / renderer / lint) は 無変更で動きます。1 ブロック・匿名 (seq { ... }) の SVG 出力は 1.7 と完全に同じ画素になります。
試す
# CLI
pnpm add -D @umlay/cli@^0.8.0
umlay render report.umlay --view report --out report.png --format png
# VS Code
code --install-extension Umlay.umlay # 0.9.0 が降ってくる完全な動作サンプルは packages/examples/samples/multi-seq-report.umlayに。RFC 0053 の議論は spec/rfcs/0053-multiple-seq-bodies.mdで読めます。