@trohde/earos 1.3.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +13 -28
  2. package/assets/init/.agents/skills/earos-assess/SKILL.md +1 -0
  3. package/assets/init/.agents/skills/earos-assess/references/output-templates.md +2 -0
  4. package/assets/init/.agents/skills/earos-report/references/portfolio-template.md +6 -6
  5. package/assets/init/.agents/skills/earos-report/references/single-artifact-template.md +3 -3
  6. package/assets/init/docs/getting-started.md +4 -0
  7. package/assets/init/docs/onboarding/agent-assisted.md +2 -0
  8. package/assets/init/docs/onboarding/first-assessment.md +2 -0
  9. package/assets/init/docs/onboarding/governed-review.md +2 -0
  10. package/assets/init/docs/onboarding/overview.md +2 -0
  11. package/assets/init/docs/plans/2026-03-23-003-feat-excalidraw-diagrams-for-site-docs-plan.md +144 -0
  12. package/assets/init/docs/solutions/tools/excal-cli-excalidraw-diagrams.md +150 -0
  13. package/assets/init/examples/aws-event-driven-order-processing/artifact.yaml +60 -60
  14. package/assets/init/examples/aws-event-driven-order-processing/evaluation.yaml +19 -0
  15. package/assets/init/examples/example-solution-architecture.evaluation.yaml +5 -0
  16. package/assets/init/standard/EAROS.md +2 -0
  17. package/assets/init/standard/schemas/evaluation.schema.json +23 -1
  18. package/assets/init/templates/evaluation-record.template.yaml +1 -0
  19. package/dist/assets/{_basePickBy-BlC_TeV6.js → _basePickBy-mT_3IjBe.js} +1 -1
  20. package/dist/assets/{_baseUniq-CVy7rcC1.js → _baseUniq-Cv2MxFNX.js} +1 -1
  21. package/dist/assets/{arc-Cd8wvd7z.js → arc-Cs5mluno.js} +1 -1
  22. package/dist/assets/{architectureDiagram-2XIMDMQ5-D_f4_aMp.js → architectureDiagram-2XIMDMQ5-aRHaZbcU.js} +1 -1
  23. package/dist/assets/{blockDiagram-WCTKOSBZ-B-y6N5--.js → blockDiagram-WCTKOSBZ-CN7d3tNj.js} +1 -1
  24. package/dist/assets/{c4Diagram-IC4MRINW-C3-v3oNT.js → c4Diagram-IC4MRINW-CbYPMw8E.js} +1 -1
  25. package/dist/assets/channel-BxUo49pD.js +1 -0
  26. package/dist/assets/{chunk-4BX2VUAB-CMPwQN83.js → chunk-4BX2VUAB-Ddbj_hri.js} +1 -1
  27. package/dist/assets/{chunk-55IACEB6-Bdkfhvrr.js → chunk-55IACEB6-CXxIm61-.js} +1 -1
  28. package/dist/assets/{chunk-FMBD7UC4-ptKQX5uF.js → chunk-FMBD7UC4-CUC_CkYr.js} +1 -1
  29. package/dist/assets/{chunk-JSJVCQXG-DO0UU_OX.js → chunk-JSJVCQXG-Batz_s1s.js} +1 -1
  30. package/dist/assets/{chunk-KX2RTZJC-DRj2OZnD.js → chunk-KX2RTZJC-CJZOxKXH.js} +1 -1
  31. package/dist/assets/{chunk-NQ4KR5QH-C4Nsf7ww.js → chunk-NQ4KR5QH-e0BJxOiS.js} +1 -1
  32. package/dist/assets/{chunk-QZHKN3VN-B1GO0Nwy.js → chunk-QZHKN3VN-Dki98-39.js} +1 -1
  33. package/dist/assets/{chunk-WL4C6EOR-lFR6fjR8.js → chunk-WL4C6EOR-7idrJxI-.js} +1 -1
  34. package/dist/assets/classDiagram-VBA2DB6C-CNTVLV3j.js +1 -0
  35. package/dist/assets/classDiagram-v2-RAHNMMFH-CNTVLV3j.js +1 -0
  36. package/dist/assets/clone-D8hYMxQ1.js +1 -0
  37. package/dist/assets/{cose-bilkent-S5V4N54A-IpR9mVIO.js → cose-bilkent-S5V4N54A-LRANBKxN.js} +1 -1
  38. package/dist/assets/{dagre-KLK3FWXG-B4YA6T7N.js → dagre-KLK3FWXG-Bu4s8bST.js} +1 -1
  39. package/dist/assets/{diagram-E7M64L7V-Do5l6es_.js → diagram-E7M64L7V-M4laZ4RC.js} +1 -1
  40. package/dist/assets/{diagram-IFDJBPK2-D5MxfKVv.js → diagram-IFDJBPK2-pCvHsd5x.js} +1 -1
  41. package/dist/assets/{diagram-P4PSJMXO-Djr28EgW.js → diagram-P4PSJMXO-Cq0ps6wO.js} +1 -1
  42. package/dist/assets/{erDiagram-INFDFZHY-BuM-rbCL.js → erDiagram-INFDFZHY-BGqKdIB8.js} +1 -1
  43. package/dist/assets/{flowDiagram-PKNHOUZH-By3WGI7Q.js → flowDiagram-PKNHOUZH-CtoCvHdU.js} +1 -1
  44. package/dist/assets/{ganttDiagram-A5KZAMGK-GLmBfK72.js → ganttDiagram-A5KZAMGK-fUeopNQj.js} +1 -1
  45. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-BN0iXeIv.js → gitGraphDiagram-K3NZZRJ6-Mgwdz2D3.js} +1 -1
  46. package/dist/assets/{graph-CDzuMtjV.js → graph-Bi8WfLFh.js} +1 -1
  47. package/dist/assets/{index-DoeSN_Oe.js → index-DLmTE7MX.js} +169 -169
  48. package/dist/assets/{infoDiagram-LFFYTUFH-C888gaFw.js → infoDiagram-LFFYTUFH-BSE7czsK.js} +1 -1
  49. package/dist/assets/{ishikawaDiagram-PHBUUO56-ChIO9DG-.js → ishikawaDiagram-PHBUUO56-COUH_Mpn.js} +1 -1
  50. package/dist/assets/{journeyDiagram-4ABVD52K-CufMUDcs.js → journeyDiagram-4ABVD52K-46DE8Qln.js} +1 -1
  51. package/dist/assets/{kanban-definition-K7BYSVSG-BpsSVpX8.js → kanban-definition-K7BYSVSG-Du_doyHv.js} +1 -1
  52. package/dist/assets/{layout-B8RWVBSF.js → layout-DhEGmekn.js} +1 -1
  53. package/dist/assets/{linear-BJwxtq9r.js → linear-ZreraaqK.js} +1 -1
  54. package/dist/assets/{mindmap-definition-YRQLILUH-C6WPimbf.js → mindmap-definition-YRQLILUH-1kP4y7-4.js} +1 -1
  55. package/dist/assets/{pieDiagram-SKSYHLDU-DeCGMWf8.js → pieDiagram-SKSYHLDU-DxSxF16z.js} +1 -1
  56. package/dist/assets/{quadrantDiagram-337W2JSQ-D9TWaS83.js → quadrantDiagram-337W2JSQ-BbeKxujG.js} +1 -1
  57. package/dist/assets/{requirementDiagram-Z7DCOOCP-DTnuXlAq.js → requirementDiagram-Z7DCOOCP-12SZh9Bz.js} +1 -1
  58. package/dist/assets/{sankeyDiagram-WA2Y5GQK-B2dplCgD.js → sankeyDiagram-WA2Y5GQK-BTUJlxZt.js} +1 -1
  59. package/dist/assets/{sequenceDiagram-2WXFIKYE-cBvgSSju.js → sequenceDiagram-2WXFIKYE-CbQi4c9p.js} +1 -1
  60. package/dist/assets/{stateDiagram-RAJIS63D-Cwr7VtSX.js → stateDiagram-RAJIS63D-B-SEPQcr.js} +1 -1
  61. package/dist/assets/stateDiagram-v2-FVOUBMTO-wb9DWSX2.js +1 -0
  62. package/dist/assets/{timeline-definition-YZTLITO2-Dkp163fK.js → timeline-definition-YZTLITO2-CCfTUHCJ.js} +1 -1
  63. package/dist/assets/{treemap-KZPCXAKY-BUWHa5xU.js → treemap-KZPCXAKY-CCfAr2lH.js} +1 -1
  64. package/dist/assets/{vennDiagram-LZ73GAT5-BihD66ma.js → vennDiagram-LZ73GAT5-By0c5-zz.js} +1 -1
  65. package/dist/assets/{xychartDiagram-JWTSCODW-Cw4lPbuZ.js → xychartDiagram-JWTSCODW-fsp7LjtZ.js} +1 -1
  66. package/dist/index.html +1 -1
  67. package/export-docx.js +5 -2
  68. package/package.json +1 -1
  69. package/schemas/evaluation.schema.json +23 -1
  70. package/utils/criterion-questions.js +100 -0
  71. package/dist/assets/channel-BSC0F15G.js +0 -1
  72. package/dist/assets/classDiagram-VBA2DB6C-BHDWMOEz.js +0 -1
  73. package/dist/assets/classDiagram-v2-RAHNMMFH-BHDWMOEz.js +0 -1
  74. package/dist/assets/clone-BdN-3iAD.js +0 -1
  75. package/dist/assets/stateDiagram-v2-FVOUBMTO-B59h7VTZ.js +0 -1
package/README.md CHANGED
@@ -29,21 +29,18 @@ Override download URLs with environment variables if needed:
29
29
 
30
30
  ## What `earos init` Creates
31
31
 
32
- ```
33
- my-architecture/
34
- ├── core/ Core meta-rubric (universal foundation, 9 dimensions)
35
- ├── profiles/ Artifact-specific profiles (5 bundled: solution-architecture,
36
- │ reference-architecture, adr, capability-map, roadmap)
37
- ├── overlays/ Cross-cutting overlays (3 bundled: security, data-governance,
38
- │ regulatory)
39
- ├── standard/schemas/ JSON schemas for rubrics, evaluations, and artifacts
40
- ├── templates/ Blank scaffolds for new profiles and evaluations
41
- ├── evaluations/ Your evaluation records go here
42
- ├── calibration/ Calibration artifacts and results
43
- ├── .agents/skills/ 10 EaROS skills for any AI coding agent
44
- ├── earos.manifest.yaml Single source of truth — inventory of all rubric files
45
- └── AGENTS.md Project guide for AI agents (agent-agnostic)
46
- ```
32
+ | Path | Purpose |
33
+ |------|---------|
34
+ | `core/` | Core meta-rubric universal foundation, 9 dimensions |
35
+ | `profiles/` | Artifact-specific profiles (5 bundled: solution-architecture, reference-architecture, adr, capability-map, roadmap) |
36
+ | `overlays/` | Cross-cutting overlays (3 bundled: security, data-governance, regulatory) |
37
+ | `standard/schemas/` | JSON schemas for rubrics, evaluations, and artifacts |
38
+ | `templates/` | Blank scaffolds for new profiles and evaluations |
39
+ | `evaluations/` | Your evaluation records go here |
40
+ | `calibration/` | Calibration artifacts and results |
41
+ | `.agents/skills/` | 10 EaROS skills for any AI coding agent |
42
+ | `earos.manifest.yaml` | Single source of truth — inventory of all rubric files |
43
+ | `AGENTS.md` | Project guide for AI agents (agent-agnostic) |
47
44
 
48
45
  The workspace is **agent-agnostic** — the `.agents/skills/` directory works with any AI coding agent that reads skill files (Claude Code, Cursor, Copilot Workspace, and others).
49
46
 
@@ -116,19 +113,7 @@ See the [EaROS repository](https://github.com/ThomasRohde/EAROS) for full skill
116
113
 
117
114
  EaROS uses a **three-layer model**:
118
115
 
119
- ```
120
- ┌─────────────────────────────────────────────────────┐
121
- │ OVERLAYS — cross-cutting concerns │
122
- │ security · data-governance · regulatory │
123
- ├─────────────────────────────────────────────────────┤
124
- │ PROFILES — artifact-specific extensions │
125
- │ solution-architecture · reference-architecture │
126
- │ adr · capability-map · roadmap │
127
- ├─────────────────────────────────────────────────────┤
128
- │ CORE — universal foundation (always applied) │
129
- │ 9 dimensions · 10 criteria │
130
- └─────────────────────────────────────────────────────┘
131
- ```
116
+ ![EaROS three-layer model](https://thomasrohde.github.io/EAROS/diagrams/earos-layers.svg)
132
117
 
133
118
  **Scoring** uses a 0–4 ordinal scale (0 = Absent → 4 = Strong) with explicit gate types that prevent weak scores from being hidden by weighted averages:
134
119
 
@@ -91,6 +91,7 @@ For each criterion:
91
91
  Minimum output per criterion:
92
92
  ```
93
93
  criterion_id: [ID]
94
+ criterion_question: "[full question text from the rubric]"
94
95
  score: [0-4 or N/A]
95
96
  evidence_class: [observed/inferred/external/none]
96
97
  confidence: [high/medium/low]
@@ -55,12 +55,14 @@ overall_score: [weighted average to 1 decimal place — e.g. 2.8]
55
55
 
56
56
  gate_failures:
57
57
  - criterion_id: [ID]
58
+ criterion_question: "[full question text from the rubric]"
58
59
  severity: [critical | major]
59
60
  effect: [what the gate failure causes]
60
61
  # If no gate failures: gate_failures: []
61
62
 
62
63
  criterion_results:
63
64
  - criterion_id: [ID]
65
+ criterion_question: "[full question text from the rubric]"
64
66
  # Use IDs from the rubric YAML, e.g. STK-01, SCP-01, TRC-01
65
67
  score: [0 | 1 | 2 | 3 | 4 | "N/A"]
66
68
  evidence_class: [observed | inferred | external]
@@ -72,9 +72,9 @@ Use this template when generating a report covering 2 or more EAROS evaluation r
72
72
 
73
73
  [If gate failures present:]
74
74
 
75
- | Criterion | Gate Severity | Artifacts Failed | Failure Rate | Status Effect |
76
- |-----------|--------------|-----------------|-------------|---------------|
77
- | [ID] | [critical/major] | [N] ([list artifact names]) | [%] | [reject/cap at conditional_pass] |
75
+ | Criterion | Name | Gate Severity | Artifacts Failed | Failure Rate | Status Effect |
76
+ |-----------|------|--------------|-----------------|-------------|---------------|
77
+ | [ID] | [criterion question] | [critical/major] | [N] ([list artifact names]) | [%] | [reject/cap at conditional_pass] |
78
78
  | ... | | | | |
79
79
 
80
80
  **Systemic gate failures** (criterion failing in ≥30% of artifacts):
@@ -161,9 +161,9 @@ Use this template when generating a report covering 2 or more EAROS evaluation r
161
161
 
162
162
  *Score distribution across all artifacts by criterion.*
163
163
 
164
- | Criterion | Avg | [Art 1] | [Art 2] | [Art 3] | ... |
165
- |-----------|-----|---------|---------|---------|-----|
166
- | [ID] | [avg] | [score] | [score] | [score] | |
164
+ | Criterion | Name | Avg | [Art 1] | [Art 2] | [Art 3] | ... |
165
+ |-----------|------|-----|---------|---------|---------|-----|
166
+ | [ID] | [criterion question] | [avg] | [score] | [score] | [score] | |
167
167
  | ... | | | | | |
168
168
 
169
169
  **Colour key:** 🟢 Score ≥3 | 🟡 Score 2 | 🟠 Score 1 | 🔴 Score 0 | — N/A
@@ -96,9 +96,9 @@ Actions are ordered by priority. Gate-related actions must be addressed before r
96
96
 
97
97
  ## Detailed Criterion Results
98
98
 
99
- | Criterion | Dimension | Score | Conf. | Evidence Class | N/A Reason |
100
- |-----------|-----------|-------|-------|---------------|------------|
101
- | [ID] | [dim] | [0-4/N/A] | [H/M/L] | [obs/inf/ext] | [if N/A: reason] |
99
+ | Criterion | Name | Dimension | Score | Conf. | Evidence Class | N/A Reason |
100
+ |-----------|------|-----------|-------|-------|---------------|------------|
101
+ | [ID] | [criterion question] | [dim] | [0-4/N/A] | [H/M/L] | [obs/inf/ext] | [if N/A: reason] |
102
102
  | ... | | | | | |
103
103
 
104
104
  ---
@@ -32,6 +32,8 @@ If your artifact does not match any profile, apply only the core rubric. The cor
32
32
 
33
33
  ## Step 2: Select Your Rubric Set
34
34
 
35
+ ![Rubric composition model](https://thomasrohde.github.io/EAROS/diagrams/rubric-composition.svg)
36
+
35
37
  Every assessment starts with the core and adds a profile, plus any applicable overlays.
36
38
 
37
39
  **Minimum (core only):**
@@ -110,6 +112,8 @@ Gate criteria represent non-negotiable minimums on their respective concern. A c
110
112
 
111
113
  ## Step 7: Determine the Status
112
114
 
115
+ ![Status determination decision tree](https://thomasrohde.github.io/EAROS/diagrams/status-determination.svg)
116
+
113
117
  The scoring sheet calculates the weighted dimension average automatically. Read the status from the aggregation tab:
114
118
 
115
119
  | Weighted Average | Status |
@@ -12,6 +12,8 @@ At Level 3, human reviewers follow the RULERS protocol with calibrated judgment.
12
12
 
13
13
  Agent evaluations follow an 8-step directed acyclic graph (DAG). Each step must complete before the next begins. No steps may be skipped.
14
14
 
15
+ ![8-step DAG evaluation flow](https://thomasrohde.github.io/EAROS/diagrams/dag-evaluation-flow.svg)
16
+
15
17
  ### The 8-Step DAG Evaluation Flow
16
18
 
17
19
  **Step 1 — Structural Validation.** The agent confirms the artifact conforms to its declared type. Does it have the expected sections? Is it machine-readable or does it require OCR? Can the agent identify the artifact's scope and purpose?
@@ -110,6 +110,8 @@ In the core rubric, two criteria have **critical** gates: **SCP-01** (Scope and
110
110
 
111
111
  ## Interpreting Your Results
112
112
 
113
+ ![Status determination decision tree](https://thomasrohde.github.io/EAROS/diagrams/status-determination.svg)
114
+
113
115
  After scoring all criteria and checking gates, compute the weighted average across dimensions and apply the status thresholds:
114
116
 
115
117
  | Status | Threshold |
@@ -77,6 +77,8 @@ Observed evidence is always preferred. If you find yourself relying heavily on i
77
77
 
78
78
  ## The Three Evaluation Types
79
79
 
80
+ ![Three evaluation lenses](https://thomasrohde.github.io/EAROS/diagrams/evaluation-lenses.svg)
81
+
80
82
  EAROS distinguishes three distinct judgment types that should not be collapsed into a single opaque score:
81
83
 
82
84
  | Type | Question It Answers | Example |
@@ -15,6 +15,8 @@ EAROS applies these lessons to a specific domain: architecture artifact evaluati
15
15
 
16
16
  ## The Five Levels
17
17
 
18
+ ![EaROS maturity levels](https://thomasrohde.github.io/EAROS/diagrams/maturity-levels.svg)
19
+
18
20
  ### Level 1 — Ad Hoc
19
21
 
20
22
  No formal review process. Evaluation quality depends entirely on who happens to review the artifact. Different reviewers apply different mental models, and feedback is inconsistent and unreproducible.
@@ -0,0 +1,144 @@
1
+ ---
2
+ title: "Add Excalidraw diagrams to site documentation"
3
+ type: feat
4
+ status: tier1-complete
5
+ date: 2026-03-23
6
+ ---
7
+
8
+ # Add Excalidraw diagrams to site documentation
9
+
10
+ ## Overview
11
+
12
+ The EaROS documentation site renders markdown content on GitHub Pages. Several key concepts — evaluation flows, rubric composition, gate logic, maturity levels — are abstract enough that text and tables alone leave readers to build their own mental model. Excalidraw SVG diagrams can make these concepts immediately visual without adding build complexity.
13
+
14
+ The `excal` CLI workflow is already established (see `docs/solutions/tools/excal-cli-excalidraw-diagrams.md`) and one diagram is live (`site/public/diagrams/earos-layers.svg`). This plan identifies the highest-value opportunities and sequences them.
15
+
16
+ ## Approach
17
+
18
+ Create `.excalidraw` source files, render to SVG with `excal render --svg --no-background`, place in `site/public/diagrams/`, and embed in the relevant markdown via full GitHub Pages URL. Commit both source and rendered output.
19
+
20
+ All diagrams follow the established style: `roughness: 1` (handwritten), `fontFamily: 1` (Virgil), pastel fills, transparent backgrounds.
21
+
22
+ ## Diagram Opportunities
23
+
24
+ ### Tier 1 — Highest impact (abstract concepts, most benefit from visualisation)
25
+
26
+ These five diagrams address the most complex or frequently misunderstood parts of the framework.
27
+
28
+ #### 1. Eight-step DAG evaluation flow
29
+ - **Doc:** `docs/onboarding/agent-assisted.md` (lines 13–33)
30
+ - **What:** Eight sequential boxes with arrows showing the evaluation pipeline: Structural Validation → Content Extraction → Criterion Scoring → Cross-Reference Validation → Dimension Aggregation → Challenge Pass → Calibration → Status Determination.
31
+ - **Why:** This is the single most abstract concept in the docs. The sequential ordering and the "challenge pass bottleneck" are frequently misunderstood. A Mermaid version exists in the repo README but is not rendered on the site docs page.
32
+ - **Elements:** 8 rectangles (numbered), directional arrows, annotation callout on Challenge Pass ("most commonly skipped").
33
+ - **File:** `site/public/diagrams/dag-evaluation-flow.excalidraw`
34
+
35
+ #### 2. Status determination decision tree
36
+ - **Docs:** `standard/EAROS.md` (lines 238–259), `docs/getting-started.md` (lines 111–123), `docs/onboarding/first-assessment.md` (lines 111–122)
37
+ - **What:** Flowchart showing gate-first logic: check critical gates → if fail, Reject/Not Reviewable (stop). Otherwise compute weighted average → ≥ 3.2 Pass, 2.4–3.19 Conditional Pass, < 2.4 Rework Required.
38
+ - **Why:** The two-phase logic (gates first, then thresholds) is the core of the scoring model and is easy to get wrong from text alone.
39
+ - **Elements:** Diamond decision nodes for gate checks, rectangle outcome nodes colour-coded by status (green/yellow/orange/red), threshold labels on arrows.
40
+ - **File:** `site/public/diagrams/status-determination.excalidraw`
41
+ - **Reuse:** Embed in all three docs that describe status determination.
42
+
43
+ #### 3. Rubric composition model
44
+ - **Doc:** `docs/getting-started.md` (lines 33–57)
45
+ - **What:** Visual showing how Core + Profile + Overlays stack to form a complete rubric set. Example scenario: "Evaluating a payment service architecture" → Core (always) + Solution-Architecture profile + Security overlay + Regulatory overlay.
46
+ - **Why:** The three-layer concept is central to EaROS. The existing `earos-layers.svg` shows the layers but not how a practitioner *assembles* them for a specific evaluation.
47
+ - **Elements:** Three layer blocks (core at bottom, profile in middle, overlays on top), example artifact callout on the left, arrows showing selection.
48
+ - **File:** `site/public/diagrams/rubric-composition.excalidraw`
49
+
50
+ #### 4. Maturity progression with capability stacking
51
+ - **Doc:** `docs/onboarding/overview.md` (lines 16–64)
52
+ - **What:** Five levels shown as ascending blocks. Each level adds capabilities on top of the previous: Level 1 (Ad Hoc) → Level 2 (Rubric-Based: add core rubric, scoring, evidence) → Level 3 (Governed: add profiles, overlays, calibration) → Level 4 (Hybrid: add AI agents, challenge pass) → Level 5 (Optimised: add CI/CD, continuous calibration).
53
+ - **Why:** The site renders this as a stepper component, but the capability *accumulation* is invisible. A stacked diagram shows what's new at each level.
54
+ - **Elements:** 5 horizontal bars of increasing width, each labelled with what's added, arrow showing progression.
55
+ - **File:** `site/public/diagrams/maturity-levels.excalidraw`
56
+
57
+ #### 5. Three evaluation lenses
58
+ - **Doc:** `docs/onboarding/governed-review.md` (lines 78–90)
59
+ - **What:** Three overlapping circles (or three columns) showing: Artifact Quality (completeness, coherence, clarity), Architectural Fitness (soundness, quality attributes, risks), Governance Fit (compliance, controls, review expectations).
60
+ - **Why:** Reviewers often conflate these perspectives. A diagram showing them as distinct but complementary lenses sharpens evaluation quality.
61
+ - **Elements:** Three labelled regions with key concerns listed inside each.
62
+ - **File:** `site/public/diagrams/evaluation-lenses.excalidraw`
63
+
64
+ ### Tier 2 — Medium impact (process flows, relationships)
65
+
66
+ #### 6. Calibration workflow loop
67
+ - **Doc:** `docs/onboarding/governed-review.md` (lines 94–122)
68
+ - **What:** 7-step calibration process with a feedback loop: Select artifacts → Score independently → Compare → Identify disagreements → Resolve → Compute κ → Update decision trees → (loop back).
69
+ - **File:** `site/public/diagrams/calibration-workflow.excalidraw`
70
+
71
+ #### 7. Hybrid evaluation model
72
+ - **Doc:** `docs/onboarding/agent-assisted.md` (lines 71–87)
73
+ - **What:** Side-by-side comparison: Human path (contextual judgment) ↔ AI path (consistency, coverage) → Reconciliation centre → Final evaluation record.
74
+ - **File:** `site/public/diagrams/hybrid-model.excalidraw`
75
+
76
+ #### 8. CI/CD integration pipeline
77
+ - **Doc:** `docs/onboarding/scaling-optimization.md` (lines 11–31)
78
+ - **What:** Pipeline diagram: Architecture artifact modified → PR/MR → EAROS evaluation triggered → colour-coded outcomes (red: blocked, yellow: conditional, green: clean merge).
79
+ - **File:** `site/public/diagrams/cicd-pipeline.excalidraw`
80
+
81
+ #### 9. Profile selection matrix
82
+ - **Doc:** `docs/onboarding/governed-review.md` (lines 17–33)
83
+ - **What:** Artifact type → profile mapping with visual callouts showing what each profile adds.
84
+ - **File:** `site/public/diagrams/profile-selection.excalidraw`
85
+
86
+ #### 10. Continuous calibration feedback loop
87
+ - **Doc:** `docs/onboarding/scaling-optimization.md` (lines 33–48)
88
+ - **What:** Circular flow: Evaluations → Score distribution tracking → Wasserstein distance → Threshold check → Recalibration (if needed) → (loop).
89
+ - **File:** `site/public/diagrams/continuous-calibration.excalidraw`
90
+
91
+ ### Tier 3 — Clarification (helpful but lower priority)
92
+
93
+ #### 11. Nine dimensions grid
94
+ - **Doc:** `docs/onboarding/first-assessment.md` (lines 48–64)
95
+ - **What:** 3×3 visual grid of the 9 core dimensions, with gate indicators.
96
+ - **File:** `site/public/diagrams/nine-dimensions.excalidraw`
97
+
98
+ #### 12. Gate severity hierarchy
99
+ - **Doc:** `docs/onboarding/first-assessment.md` (lines 97–109)
100
+ - **What:** Three-level severity stack: Advisory → Major → Critical, with effects.
101
+ - **File:** `site/public/diagrams/gate-hierarchy.excalidraw`
102
+
103
+ #### 13. Evidence extraction workflow
104
+ - **Doc:** `docs/getting-started.md` (lines 81–99)
105
+ - **What:** 5-box flow: Find evidence → Record citation → Match to scoring guide → Assign score → Flag uncertainty.
106
+ - **File:** `site/public/diagrams/evidence-workflow.excalidraw`
107
+
108
+ #### 14. Overlay selection triggers
109
+ - **Doc:** `docs/onboarding/governed-review.md` (lines 35–49)
110
+ - **What:** Decision tree for when to apply each overlay (Security, Data Governance, Regulatory).
111
+ - **File:** `site/public/diagrams/overlay-selection.excalidraw`
112
+
113
+ #### 15. Profile creation workflow
114
+ - **Doc:** `docs/onboarding/scaling-optimization.md` (lines 51–69), `docs/profile-authoring-guide.md` (lines 14–22)
115
+ - **What:** 6-step design method selection with decision points.
116
+ - **File:** `site/public/diagrams/profile-creation.excalidraw`
117
+
118
+ ## Acceptance Criteria
119
+
120
+ - [ ] Tier 1 diagrams (5) created, validated, rendered, and embedded in their docs
121
+ - [ ] Each diagram follows style conventions: roughness 1, Virgil font, pastel fills, transparent background
122
+ - [ ] Both `.excalidraw` source and `.svg` output committed for every diagram
123
+ - [ ] SVGs embedded via full GitHub Pages URL for cross-platform rendering
124
+ - [ ] Site deployed and diagrams verified on live pages
125
+ - [ ] Tier 2 diagrams (5) created and embedded
126
+ - [ ] Tier 3 diagrams (5) created and embedded (stretch)
127
+
128
+ ## Implementation Notes
129
+
130
+ - All diagrams live in `site/public/diagrams/` so the Deploy Site workflow picks them up automatically.
131
+ - The status determination diagram (#2) is reused across 3 docs — embed the same SVG URL in each.
132
+ - The Deploy Site workflow triggers on `site/**` and `docs/**` changes, so pushing diagrams + updated docs in the same commit triggers a single deploy.
133
+ - For complex diagrams (DAG flow, decision tree), consider using frames in Excalidraw to group related elements.
134
+ - Run `excal validate` on every `.excalidraw` file before rendering.
135
+
136
+ ## Sequencing
137
+
138
+ Start with Tier 1 in order (DAG flow first — highest value, most complex). Each diagram is independent, so they can be done in parallel if needed. Tier 2 and 3 follow once Tier 1 is verified on the live site.
139
+
140
+ ## Sources
141
+
142
+ - Excal CLI learning: `docs/solutions/tools/excal-cli-excalidraw-diagrams.md`
143
+ - Existing example: `site/public/diagrams/earos-layers.excalidraw` / `.svg`
144
+ - Style conventions: roughness 1, fontFamily 1, `--no-background`, pastel palette (#a5d8ff, #b2f2bb, #ffec99, #fcc2d7, #dee2e6)
@@ -0,0 +1,150 @@
1
+ ---
2
+ title: "Creating Excalidraw diagrams with the excal CLI"
3
+ category: tools
4
+ date: 2026-03-23
5
+ tags:
6
+ - excalidraw
7
+ - excal-cli
8
+ - svg
9
+ - diagrams
10
+ - documentation
11
+ component: "diagrams / documentation"
12
+ problem_type: technique
13
+ severity: low
14
+ resolved: true
15
+ resolution_type: workflow
16
+ ---
17
+
18
+ ## Purpose
19
+
20
+ `excal` is an agent-first CLI for creating, validating, and rendering Excalidraw diagrams. It produces resolution-independent SVGs that render identically across GitHub Pages, npmjs, VS Code preview, and any browser — unlike unicode art or ASCII diagrams, which depend on font support.
21
+
22
+ Use it whenever documentation needs a visual: architecture layers, data flows, component relationships, deployment topologies.
23
+
24
+ ## Workflow
25
+
26
+ ### 1. Create an Excalidraw scene
27
+
28
+ Write a `.excalidraw` JSON file:
29
+
30
+ ```json
31
+ {
32
+ "type": "excalidraw",
33
+ "version": 2,
34
+ "elements": [ ... ],
35
+ "appState": { "viewBackgroundColor": "#ffffff" },
36
+ "files": {}
37
+ }
38
+ ```
39
+
40
+ Elements include rectangles, ellipses, diamonds, arrows, lines, text, and images. Run `excal skill` for the full element reference.
41
+
42
+ ### 2. Bound text (labels inside shapes)
43
+
44
+ To place text inside a rectangle:
45
+
46
+ - Rectangle: `"boundElements": [{ "id": "text-id", "type": "text" }]`
47
+ - Text: `"containerId": "rectangle-id"`
48
+ - Text `x` = `container.x + padding` (e.g., 20px)
49
+ - Text `y` = `container.y + (container.height - textHeight) / 2`
50
+ - Text `width` = `container.width - (2 × padding)`
51
+ - `"textAlign": "center"`, `"verticalAlign": "middle"`
52
+
53
+ **Critical:** Text `x` must be the **left edge** of the text area, not the center point. `textAlign: "center"` handles horizontal centering within the text width. Setting `x` to the container center pushes text to the right.
54
+
55
+ ### 3. Style conventions
56
+
57
+ | Property | Value | Notes |
58
+ |----------|-------|-------|
59
+ | `roughness` | `1` | Handwritten/sketchy (project standard) |
60
+ | `fontFamily` | `1` | Virgil — Excalidraw's handwritten font |
61
+ | `fillStyle` | `"solid"` | Solid background fills |
62
+ | `strokeWidth` | `2` | Visible but not heavy |
63
+ | `roundness` | `{ "type": 3 }` | Rounded corners on rectangles |
64
+
65
+ Pastel fill palette:
66
+
67
+ | Colour | Hex | Use |
68
+ |--------|-----|-----|
69
+ | Blue | `#a5d8ff` | Primary / top layer |
70
+ | Green | `#b2f2bb` | Secondary / middle layer |
71
+ | Yellow | `#ffec99` | Tertiary / foundation layer |
72
+ | Pink | `#fcc2d7` | Alerts / warnings |
73
+ | Gray | `#dee2e6` | Neutral / background |
74
+
75
+ ### 4. Validate
76
+
77
+ ```bash
78
+ excal validate diagram.excalidraw
79
+ ```
80
+
81
+ Returns structured JSON. Check `result.valid` is `true` before rendering. Also validates frame references, bound text bindings, and arrow connections.
82
+
83
+ ### 5. Render to SVG
84
+
85
+ ```bash
86
+ excal render diagram.excalidraw --svg --no-background --outDir ./output
87
+ ```
88
+
89
+ Key flags:
90
+
91
+ | Flag | Purpose |
92
+ |------|---------|
93
+ | `--svg` | SVG output (default) |
94
+ | `--png` | PNG output (requires Playwright) |
95
+ | `--no-background` | Transparent background — required for dark-mode compatibility |
96
+ | `--dark-mode` | Render with dark theme |
97
+ | `--scale <n>` | Scale factor for PNG (default: 2) |
98
+ | `--frame <id\|name>` | Export a single frame |
99
+ | `--padding <n>` | Padding in pixels (default: 20) |
100
+ | `--dry-run` | Validate pipeline without writing files |
101
+
102
+ ### 6. Embed in markdown
103
+
104
+ Use the full published URL for cross-platform rendering:
105
+
106
+ ```markdown
107
+ ![Diagram description](https://thomasrohde.github.io/EAROS/diagrams/diagram-name.svg)
108
+ ```
109
+
110
+ Full URLs work on GitHub Pages, npm README pages, and VS Code preview. Relative paths resolve inconsistently across platforms.
111
+
112
+ ### 7. Commit and deploy
113
+
114
+ Commit both the `.excalidraw` source (for future edits) and the `.svg` output (for rendering). Place SVGs under a path the deploy workflow watches.
115
+
116
+ ## CLI Reference
117
+
118
+ | Command | Purpose |
119
+ |---------|---------|
120
+ | `excal inspect <file>` | Element counts, bounds, metadata |
121
+ | `excal validate <file>` | Structural consistency check |
122
+ | `excal render <file>` | Render to SVG, PNG, or PDF |
123
+ | `excal guide` | Full CLI guide as markdown |
124
+ | `excal skill` | Excalidraw domain knowledge for agents |
125
+
126
+ All commands return a structured JSON envelope with `ok`, `result`, `warnings`, `errors`, and `metrics`.
127
+
128
+ ## Checklist
129
+
130
+ When adding a diagram to documentation:
131
+
132
+ - [ ] Authored as `.excalidraw` source file
133
+ - [ ] `roughness: 1`, `fontFamily: 1` (handwritten style)
134
+ - [ ] Text centered: `textAlign: "center"`, `verticalAlign: "middle"`
135
+ - [ ] Validated with `excal validate`
136
+ - [ ] Rendered with `excal render --svg --no-background`
137
+ - [ ] Embedded using full URL
138
+ - [ ] Both `.excalidraw` and `.svg` committed
139
+
140
+ ## Example
141
+
142
+ The EaROS three-layer model diagram:
143
+
144
+ - Source: `site/public/diagrams/earos-layers.excalidraw`
145
+ - Rendered: `site/public/diagrams/earos-layers.svg`
146
+ - Embedded in: `tools/editor/README.md`
147
+
148
+ ## Origin
149
+
150
+ Discovered while replacing unicode box-drawing diagrams that rendered poorly on GitHub Pages. Unicode characters like `─` (U+2500) are invisible in many web monospace fonts. The `excal` approach solves this and generalises to any diagram need.