From 6e5d3fb45ab1269900001ec1a19eff107087f984 Mon Sep 17 00:00:00 2001 From: Jan-Peter von Hunnius Date: Mon, 5 Oct 2026 10:00:45 +0200 Subject: [PATCH] openup: architecture notebook + EA diagram renders - analysis-design/architecture-notebook.md: Architecture Notebook work product in the keyfob docx template structure (10 sections), grounded in mapping / design note / supplementary specs; embeds the component model and all 12 realization figures - scripts/openup/export-diagram-images.ps1: read-only EA COM renderer (EA-15 findings: image API on ProjectInterface, OpenDiagram before export or blank stub, type 0 = PNG); renders reflect manual layouts - renders: requirements/use-case-overview.png, analysis-design/ uc-01..12-realization.png + component-architecture.png; embedded as figures in use-case-model.md and uc-realization-mapping.md - BUILD-CHECKLIST 6.4 documents the exporter --- .../analysis-design/architecture-notebook.md | 244 ++++++++++++++++++ .../component-architecture.png | Bin 0 -> 63308 bytes .../analysis-design/uc-01-realization.png | Bin 0 -> 22904 bytes .../analysis-design/uc-02-realization.png | Bin 0 -> 16476 bytes .../analysis-design/uc-03-realization.png | Bin 0 -> 29384 bytes .../analysis-design/uc-04-realization.png | Bin 0 -> 15276 bytes .../analysis-design/uc-05-realization.png | Bin 0 -> 22924 bytes .../analysis-design/uc-06-realization.png | Bin 0 -> 22988 bytes .../analysis-design/uc-07-realization.png | Bin 0 -> 22868 bytes .../analysis-design/uc-08-realization.png | Bin 0 -> 35828 bytes .../analysis-design/uc-09-realization.png | Bin 0 -> 16492 bytes .../analysis-design/uc-10-realization.png | Bin 0 -> 22860 bytes .../analysis-design/uc-11-realization.png | Bin 0 -> 22856 bytes .../analysis-design/uc-12-realization.png | Bin 0 -> 22892 bytes .../analysis-design/uc-realization-mapping.md | 4 + docs/openup/model/BUILD-CHECKLIST.md | 9 + docs/openup/requirements/use-case-model.md | 4 + .../openup/requirements/use-case-overview.png | Bin 0 -> 114920 bytes scripts/openup/export-diagram-images.ps1 | 90 +++++++ 19 files changed, 351 insertions(+) create mode 100644 docs/openup/analysis-design/architecture-notebook.md create mode 100644 docs/openup/analysis-design/component-architecture.png create mode 100644 docs/openup/analysis-design/uc-01-realization.png create mode 100644 docs/openup/analysis-design/uc-02-realization.png create mode 100644 docs/openup/analysis-design/uc-03-realization.png create mode 100644 docs/openup/analysis-design/uc-04-realization.png create mode 100644 docs/openup/analysis-design/uc-05-realization.png create mode 100644 docs/openup/analysis-design/uc-06-realization.png create mode 100644 docs/openup/analysis-design/uc-07-realization.png create mode 100644 docs/openup/analysis-design/uc-08-realization.png create mode 100644 docs/openup/analysis-design/uc-09-realization.png create mode 100644 docs/openup/analysis-design/uc-10-realization.png create mode 100644 docs/openup/analysis-design/uc-11-realization.png create mode 100644 docs/openup/analysis-design/uc-12-realization.png create mode 100644 docs/openup/requirements/use-case-overview.png create mode 100644 scripts/openup/export-diagram-images.ps1 diff --git a/docs/openup/analysis-design/architecture-notebook.md b/docs/openup/analysis-design/architecture-notebook.md new file mode 100644 index 0000000..1f13268 --- /dev/null +++ b/docs/openup/analysis-design/architecture-notebook.md @@ -0,0 +1,244 @@ +# Skara Brae — Architecture Notebook + +Version 1.0 (2026-10-05) · OpenUP Analysis & Design artifact: `analysis-design/architecture-notebook.md` +Summary work product in the keyfob-station template structure. Sources (all in-repo, normative): +`analysis-design/uc-realization-mapping.md` (§1–§3), `analysis-design/design-wi-2-architecture-cleanup.md` +(§2–§4, §11), `requirements/supplementary-specifications.md`, `requirements/vision.md`, and the EA model +`docs/openup/model/skara-brae.eapx` (exports under `docs/openup/model/exports/`). Detailed per-WI design +remains in the WI design notes; this notebook is the cross-WI architecture view. Drift rule applies: +a mismatch between this notebook and its sources is a defect fixed in the same cycle. + +## 1. Purpose + +This notebook describes the goals, decisions, constraints and significant elements that shape the design of +Skara Brae across work items. The analysis and design models live in the EA model (Requirements / Use Case +Model, Analysis-Design realizations and Design component model); this notebook summarizes them for review +and onboarding. One model covers the whole product — server, client and common — because the use cases are +player-facing and Requirement→realization traceability spans tiers (joint-model decision, 2026-10-03). + +## 2. Architectural Goals and Philosophy + +- **Dependency rule inward** (Clean Architecture): domain in `sb-core`/`sb-shared` with zero HTTP/framework + knowledge; adapters (`sb-api`, `sb-db`, `sb-auth`) and the client at the edge (D1, CON-05). +- **Behavior continuity**: refactors are wire-format and game-semantics identical (NFR-11, NFR-19). +- **Determinism by construction**: domain randomness is injected (WI-1); identical seeds produce identical + outcomes (NFR-05, D5). +- **One taxonomy of failure**: a single domain error enum with one central HTTP status mapping (D2). +- **Data as source of truth**: game content is language-neutral JSON in `skara-brae-common`, compiled into + both consumers (NFR-13, D6). +- **Zero-warning quality gate**: fmt + clippy + full test suite on every commit (NFR-08..NFR-10). +- **Docs are architecture**: OpenUP markdown is the content source; the EA model renders it; drift is a + defect (D7). + +## 3. Assumptions and Dependencies + +- Single-process Rust server (Axum 0.8, edition 2024); all game state in memory behind `tokio::sync::RwLock`, + optional write-through persistence to SQLite via `SB_DB_PATH` (NFR-01, NFR-14). +- Static game data ships with the binary via `include_str!` from `skara-brae-common` (NFR-04, NFR-13). +- Clients are web/PWA (Vue 3 SPA) polling the REST API; server behavior is poll-frequency-independent + (NFR-02, NFR-03). +- `sb-common` is consumed as a sibling absolute-path dependency locally; git-submodule migration planned + (CON-01). +- Self-hosted pipeline: Forgejo (git), Jenkins CI, systemd deployment (vision.md; topology canon in Joplin + "Tech Stack & Architecture" note). + +## 4. Architecturally Significant Requirements + +The full set is `requirements/supplementary-specifications.md`; the categories that shape the architecture: + +| Category | IDs | Architectural consequence | +|---|---|---| +| Performance / Scalability | NFR-01..NFR-04 | in-memory state, lazy regen (no timers), lock-free catalogue reads | +| Reliability / Correctness | NFR-05..NFR-07 | injected RNG, best-effort persistence, referential data integrity → `DomainError` | +| Quality Gates | NFR-08..NFR-12 | fmt/clippy/test gates; unwrap ledger; behavior-identical refactors | +| Data | NFR-13..NFR-15 | bilingual common package, SQLite format, i64 stat growth | +| Security | NFR-16..NFR-18 | argon2, JWT HS256 + auth middleware, role model (player/admin) | +| Constraints | CON-01..CON-06 | crate layout, Axum 0.8, rand 0.9 rule, one error enum, dependency rule, docs home | +| Usability / API | NFR-19..NFR-20 | wire-format freeze (lexicographic key order), status-code contract | + +## 5. Decisions, Constraints, and Justifications + +Full records in the WI design notes; the architecture-level decisions: + +- **D1 — Layered crate architecture with inward dependencies.** `sb-api` (boundary/adapter) may import + `sb-core`, `sb-shared`, `sb-common`, `sb-db`, `sb-auth`; `sb-core` must not reference axum/http/ + serde_json-json!/tokio/sb-db/sb-api (design note §3). Known debt: ShopService, HealingService, parts of + MagicService remain handler-side in sb-api — recorded, follow-up WI question Q3; the model must not paper + over them. +- **D2 — One domain error taxonomy.** `sb_core::error::DomainError` (thiserror 2) + single status mapping + `sb-api::routes::domain_status` realize the error paths of UC-05/06/08/12 (design note §4.1). +- **D3 — Constants centralized.** `sb_core::constants` is the single audit home for game-balance scalars + (NFR "no magic numbers"); static data tables stay in their modules (design note §2). +- **D4 — Response DTOs in sb-api, not sb-shared.** HTTP wire types never leak into the domain crate; + `AdventureOutcome` derives nothing (design note §2 placement decisions). +- **D5 — Injectable RNG with a single construction point.** `request_rng()` (`StdRng::from_os_rng`, WI-1); + domain functions take `rng: &mut impl Rng` (CON-03, NFR-05). +- **D6 — Bilingual shared data package.** `skara-brae-common`: `data/` JSON single source, `rust/` + `ts/` + thin consumers, `codegen/` planned (NFR-13; tech-stack canon). +- **D7 — Joint EA model, markdown source of truth, surgical builders.** Model changes after the manual + layout session go through surgical scripts only; `build-model.ps1` rebuilds and is forbidden on the laid- + out model (mapping §1, BUILD-CHECKLIST §6). + +## 6. Architectural Mechanisms + +- **Lazy resource regeneration** — resources recompute from elapsed wall-clock time at specific call sites; + no timers or background ticks (NFR-02; UC-05/UC-08 "Regenerate Resources" sub-flow). +- **Static catalogue via LazyLock** — game data parsed once at first access; lock-free reads (NFR-04, UC-04). +- **DomainError → status mapping** — domain rule failures flow through one enum to one mapping; handlers own + store misses/authz (D2, NFR-20). +- **Wire-format freeze** — JSON keys serialize in lexicographic order; typed responses declare fields in that + order (NFR-19). +- **Injectable RNG determinism** — seeded domain tests, single entropy entry point (D5, NFR-05). +- **Best-effort write-through persistence** — SQLite behind an in-memory-authoritative process (NFR-06, + NFR-14). + +## 7. Key Abstractions + +The analysis vocabulary (boundary/controller/entity) of the use-case realizations — full mapping incl. +design elements in `uc-realization-mapping.md` §2; classes, stereotypes and interactions per UC in the EA +model (§2a lists the 24 associations + 4 «uses» dependencies). + +| Class | Stereotype | Responsibility (design element) | +|---|---|---| +| AuthBoundary | «boundary» | `POST /api/auth/register`, `AuthResponse` (UC-01) | +| TokenService | «boundary» | `POST /api/auth/login`, `AuthResponse`, auth middleware (UC-02, guards UC-03…12) | +| CharacterCatalog | «boundary» | character routes (UC-03) | +| CatalogueBrowser | «boundary» | catalogue routes + `sb-shared::responses` (UC-04) | +| GymBoundary | «boundary» | gym routes + responses (UC-05) | +| EquipmentBoundary | «boundary» | equip/unequip routes (UC-06) | +| ShopBoundary | «boundary» | shop routes + responses (UC-07) | +| AdventureBoundary | «boundary» | adventure route + `AdventureRunResponse` (UC-08) | +| TempleBoundary | «boundary» | heal route + `HealResponse` (UC-09) | +| SongBoundary | «boundary» | song routes + responses (UC-10) | +| MagicBoundary | «boundary» | spell routes + responses (UC-11) | +| ReviewBoundary | «boundary» | level-up route + response (UC-12) | +| AccountRegistry | «controller» | `sb-api::routes::{register, seed_users}` (UC-01) | +| Authenticator | «controller» | `sb-api::routes::login` + sb-auth verify/create (UC-02) | +| CharacterFactory | «controller» | `sb-core::character::create_character` (UC-03) | +| TrainingService | «controller» | `sb-core::services::train_stat` (UC-05) | +| EquipmentService | «controller» | `sb-core::services::{equip_item, unequip_item}` (UC-06) | +| ShopService | «controller» | `sb-api::routes::{shop_action, buy_item, sell_item}` (UC-07; **debt**: handler-side, extraction candidate Q3) | +| AdventureService | «controller» | `sb-core::adventure::run_adventure` (UC-08; WI-2 extraction) | +| HealingService | «controller» | `sb-api::routes::heal_character` (UC-09; **debt**: handler-side, extraction candidate Q3) | +| SongService | «controller» | `sb-api::routes::set_song` + `available_songs` (UC-10) | +| MagicService | «controller» | spell routes + `sb-core::spells` helpers (UC-11; **debt**: parts handler-side) | +| ReviewBoard | «controller» | `sb-core::character::level_up` (UC-12) | +| UserAccount | «entity» | `sb-shared::user::{User, Role}` (UC-01/02) | +| Character | «entity» | `sb-shared::character::Character` + Race/Class/Stats (UC-03) | +| ResourceRegenerator | «entity» | `sb-core::character::apply_regen` + regen constants (UC-03/05/08 sub-flow) | +| GameData | «entity» | `sb-core::data::{EnemyDef, ZoneDef, EncounterEntry, LootDrop}` (UC-04) | +| TrainingGrounds | «entity» | `TRAINING_GROUNDS`, `training_cost` (UC-05) | +| Equipment/Inventory | «entity» | `Character.equipment/.inventory`, `sb-shared::item::Item` (UC-06) | +| ShopStock | «entity» | `AppState.shop_stock` (UC-07) | +| CombatEngine | «entity» | `sb-core::combat::{resolve_combat_full, resolve_attack, crit tables, open_ended_roll}` (UC-08) | +| Combatant | «entity» | `sb-core::combat::CombatStats` (UC-08) | +| SpellEffect / BardSong | «entity» | `SpellEffect`, `sb-core::spells`, `sb-core::songs` (UC-08/10/11) | +| BardSong | «entity» | `BARD_SONGS`, `Character.active_song` (UC-10) | +| Spell | «entity» | `SpellDef`, `Character.{known_spells, active_spell, spell_points}` (UC-11) | +| Progression | «entity» | `xp_for_level`, `level_up_cost`, `MAX_LEVEL` (UC-12) | + +Cross-cutting: `DomainError` (error paths UC-05/06/08/12), `Constants` (no-magic-numbers NFR), `Responses` +(wire-format freeze NFR-19) — carried in the model's Architecture Overview package. + +## 8. Layers + +The joint component model (mapping §3); dependencies point inward only. + +| Tier | Component | Role | +|---|---|---| +| Presentation | skara-brae-client | Vue 3.5 SPA (Pinia, Vite), JWT bearer, REST via proxy; player-facing boundary of UC-01…12 | +| Boundary / adapter | sb-api | Axum routes/handlers, `domain_status`, `responses`; boundaries of all UCs | +| Adapter | sb-auth | argon2 + JWT (UC-01/02; middleware guards UC-03…12) | +| Adapter | sb-db | persistence via `sb-db::Database` | +| Domain | sb-core | controllers/entities: adventure, services, character, combat, spells, songs, data/items | +| Domain types | sb-shared | `User`, `Character`, `Item`, response types; zero HTTP imports | +| Data | sb-common | bilingual data package (`data/` JSON, `rust/`, `ts/`, `codegen/`); UC-04 data source | + +![Component Architecture](component-architecture.png) + +*Figure 1: Joint component architecture — server crates, client, common (EA model render).* + +## 9. Architectural Views + +### 9.1 Use Case View + +Architecturally significant use cases: UC-08 (Run Adventure — WI-2 design driver, combat + data integrity), +UC-03/UC-12 (character lifecycle), UC-04 (shared-data consumption), UC-05/06/07 (rule-driven economy +actions with the DomainError error paths), UC-01/02 (auth, middleware guard). Full model: +`requirements/use-case-model.md` + overview figure there. + +| Realization | Use Case | Analysis classes | +|---|---|---| +| UC-01 Realization | Register Account | AuthBoundary, AccountRegistry, UserAccount | +| UC-02 Realization | Authenticate | TokenService, Authenticator | +| UC-03 Realization | Manage Characters | CharacterCatalog, CharacterFactory, Character, ResourceRegenerator | +| UC-04 Realization | Browse Game Catalogue | CatalogueBrowser, GameData | +| UC-05 Realization | Train Stat | GymBoundary, TrainingService, TrainingGrounds | +| UC-06 Realization | Manage Equipment | EquipmentBoundary, EquipmentService, Equipment/Inventory | +| UC-07 Realization | Trade at Shop | ShopBoundary, ShopService, ShopStock | +| UC-08 Realization | Run Adventure | AdventureBoundary, AdventureService, CombatEngine, Combatant, SpellEffect / BardSong | +| UC-09 Realization | Heal at Temple | TempleBoundary, HealingService | +| UC-10 Realization | Practice Bard Song | SongBoundary, SongService, BardSong | +| UC-11 Realization | Study Magic | MagicBoundary, MagicService, Spell | +| UC-12 Realization | Level Up at Review Board | ReviewBoundary, ReviewBoard, Progression | + +### 9.2 Analysis View (Use-Case Realizations) + +Each realization package in the EA model carries a class diagram (boundary/controller/entity with §2a +associations); renders in this folder, generated by `scripts/openup/export-diagram-images.ps1`: + +![UC-01 Realization](uc-01-realization.png) + +![UC-02 Realization](uc-02-realization.png) + +![UC-03 Realization](uc-03-realization.png) + +![UC-04 Realization](uc-04-realization.png) + +![UC-05 Realization](uc-05-realization.png) + +![UC-06 Realization](uc-06-realization.png) + +![UC-07 Realization](uc-07-realization.png) + +![UC-08 Realization](uc-08-realization.png) + +![UC-09 Realization](uc-09-realization.png) + +![UC-10 Realization](uc-10-realization.png) + +![UC-11 Realization](uc-11-realization.png) + +![UC-12 Realization](uc-12-realization.png) + +### 9.3 Interaction View + +Not yet modeled: no sequence diagrams exist for the Skara Brae MVP (the EA model carries scenarios with +per-step actors, not interactions). Candidate first sequences: UC-08 adventure request→combat→loot, and +UC-01/02 auth flows. Adding them is a future work item (PlantUML prototype → EA per the workflow canon). + +### 9.4 Operational View + +Single Rust process per deployment (systemd unit on the self-hosted boxes; Forgejo + Jenkins pipeline per +vision.md). All state in memory, optional write-through SQLite (NFR-01/06/14); no Redis for MVP. The Vue SPA +is served statically and talks to the API over HTTPS (Caddy, tech-stack canon). Clients poll; no push +channel in the MVP (WebSocket notifications are a later-phase feature, vision.md). + +### 9.5 Design Diagram Index + +| Diagram | File | Documents | +|---|---|---| +| Use Case Overview | `../requirements/use-case-overview.png` | actors, use cases, associations | +| UC-01…UC-12 Realization | `uc-01-realization.png` … `uc-12-realization.png` | analysis classes + associations per UC | +| Component Architecture | `component-architecture.png` | joint component model, dependency rule | + +All three sets are renders of the EA model (`docs/openup/model/skara-brae.eapx`) produced by +`scripts/openup/export-diagram-images.ps1`; regenerate after model changes (read-only, layout-preserving). + +## 10. References + +- `requirements/vision.md`, `requirements/use-case-model.md`, `requirements/supplementary-specifications.md` +- `analysis-design/uc-realization-mapping.md` (§1 structure, §2 mapping, §2a interactions, §3 component model) +- `analysis-design/design-wi-1-injectable-rng.md`, `design-wi-2-architecture-cleanup.md` (detailed WI designs) +- EA model: `docs/openup/model/skara-brae.eapx` (+ `exports/` JSON, `BUILD-CHECKLIST.md`) +- Client-side UC realizations: future work item (joint-model decision, mapping §1) diff --git a/docs/openup/analysis-design/component-architecture.png b/docs/openup/analysis-design/component-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7c410062cac2ba75d3328f36bd175210a4720d72 GIT binary patch literal 63308 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�(8 zw-S|i&pKHeZS59@i=(Y$h268p3Ue!Cgmw($Z=o

mz9%(8dF6 z6xJ6@q>27g4|u4DF}0dK9?-@EYZT^TsWj1F<^d1%kXRo{iv!wtV2#2&ER!bs%RS&> z9+K-LX&%tV!-|-P<d{Z$_DFb~P~ku(oz5L4 zl_vV@Jm8@oUQ?^t9?-@E-`UK=I%%T6-UA-yA-O)1))#2wf%ggXuwI(zZ}5NzdPuB~ zqESTj|V)|!>ejFyD!kjLrt(a^hgu^ng=}4LteoffqFMP?IM5 zy&mu|56ShBG!JOwp)cm4SDNVedB6ibB-TgLJfMvS-eD{bebPj~-vb`%;bpa&Js!}; z!$!e8^h*={jUMnY56ShBv^b!R2i}Lx!$xVMzsUn0=pnH_lI8*Jq=!w?M1QjfJk-NW zYCXFzd?kI@+zIcSo27~VwI1+%9_&4Is@_BAtDTw6b~(=hfjNfB&e_kJus+h5OIVx9eozJ954<`XV-{vjSa<7(=H)<^J2tS8Rz zxFXM?F2UBB@~%a(KGLbs%s|}i;~V^Zu8u1 zF8^_DUncyu;>)_=Lgo7Z++2QD{KVOMop@{!;>qqcgDULR?EN8ktDZTHdHg~B(&B)- z+t10jXg}KIX|Vm%RfkxUPZ7{%+Y;ABr%)B>kLjAvxBlUG5O~+WAgb@w6*Ny=b8;7L zPJg4?x?lK#@JqqA8L#-7%$&aUi((p|hfci@?vmaif$M;@K=#0d(5sSOZC&pHAO2M5wb91I4T5>NUM1+?-~kWx z@Zo8-n*DtXZ9K51Zys(?3HmpBz(YMu{OtjK6z@B1wDGVz=3zi3=c z54%-@{vHo_sE0ANI(|K-#Q|+R+$z|3*rO8kZ}or&ddNAyk2W4|k9oLNCFtMo0T14)YhkYtRf4>Jj)I+{C2DI^TN6f>1m7srz z2RzWjyZJnzjfVp<4|k{p{R1BGP!A{6YW8?Q8xMC1HXaVB1pPZb;DH_zzXM6THqpkz zT`>=Lss#PJJm6s-K78j*wVE9VwDEAaU~#xhCFtMn0T1+$bFBq!JlqrWaJNd(zsCa} z>fsHwnjHtU@o-qMINYNW^bdQ$13iqru2!=>ppAz}Fb{`Sf_~%y5B2bxTFv$lsSY0Q z70g4V67=u&fQNbb;O%@K(8dEW5BF*d{b3JysE6OF)$BN!KJVG)VOW~z-|x}bihmzA zu0uZY-_3mR_HVIp?z?n3#(5{Q@6~AI;{m}u+^-V!AMk(&#v$i=588NmFy`R_m7xEi z2Rzint7y$+67(POfQNecjato)1KM~P z5zNCQDnWn510Luh=Xwv?cz7)4VMHb9Kjr}s_3*M<&5i@wcz9f}I6S5j^dI+t2YNVu zOs!^nKpPKF2z9_S(Gx)<7bcq-=Mh)U3Z$^#ziA>Xo}jHmUV4o^hQ5ldnAQe<1u) zp#4gDWahJ%fUaqka@VwYJdCSa6!YDy?Pi)d=ekIxoG?+<>5!ryWuF3H~peg3!H6qJjUlD`ci-gaNJ^~8Tx8RPo9!lS}J z3GwmIob`~#_$=jVP~el6IzXP;dkTo2UYda$~A zu8BzX4+$4?@8>*8#pd5ZefZ#Q{_mVFP#JNe96zqc{OEA~EAEHq{cYkrRnhxM?sZGr z2QJ5Rgt+iLAzAJ!hnA`uH6^({AkeuJToHU)9jC}?u+%^S|?+$PUhc0;Md}6`DEhTr}mx~h%d8z#J5&{ zwsoXsWTwS*vhlTNHP?vovN+f0pkV1akv<#b;y)JpwcYN2`DL}@Yq@c5`zPk}waNJ6 XxtIKIP^>lfX}4 literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-02-realization.png b/docs/openup/analysis-design/uc-02-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..70b837420a9215ed61763acee6f060a76f48d9e3 GIT binary patch literal 16476 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 YeaZh^$rJ|WZ=y!+!@qN2;oeC6|60$2C;$Ke literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-04-realization.png b/docs/openup/analysis-design/uc-04-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4cfb650d029c66531e138816f7339cf429d5a9 GIT binary patch literal 15276 zcmeI3TZ~oJ8OPVT%w2HWYHCw#4;O_QKrs>=kunE{i^eGo$cQL`VHib_4#z^qw~s9`JywlzrN(Kt zj=xACP87NHwP~jPTY~AacI70xQSIcHKHyH_LIF+ft}j<^?8~(`Ra|>hEhe#n;B%UhV&OUFT%t zYrb^Iq+)904jnTDat=4Kw)+pUE|zQi)a+UXu2(A@6W{)ZwrSINaV_ zbZ_6Od(4mZ`*k_n2n_wyr+0kp5?b;`PAD6MmjrU9wEKHGV}yG~fB%EaE`8>~=h)^r z#&@p}FG`&+`_;HzncC*|>R-wAD|7R8XIv zPA$6;i{oRDJr;GiXR95qW5V-cx{l`B8Wi9srgqI?n?{+wB=7g~>)S8UuN{xhA%W|U z_G^VTvF%RT;5v7+eyvP+zv#BswE6<=fRB5EouiWMV?taMlhkL{7VX_9kP8a^7YK~A zl0YH$#0A*Xz9jo}1>Sz`cv48KEk1C@pIds(^Bf%4Cs?VC*lKl(8lvLEg{b&?{%D~u z-zD6e@5_(nUKbuNjOEr8@68`Bb`=g6j|x$7jqq@RXFl4O3dARwi?{~UM!tzfJ$}n% z*2~2A3yU{9Ef47YD)MexMHg{R+%Irl*Ph||+<(o%bh#;yfUkL&hl5@ zK3+ZX+2>WOt>23;_AY(A@(Yc>sGI%PhkjGbu59O?m($tqPt{J1swGmI|ZAmxW4ku@DtvoT)jq z@zEn?Tu0YtHC;XRtUG|@3J>fs4WE5?+ zz>S701=DbaIN`t213Og1d-9sC0d6!b6imaF;)H*p2X>%_58sv7Yz=UuVUb`O7K#)8 zMIP8;8b1Bt9eK^x05=-05=_G)al(I<2X>%_V{glAwg$M-&?T6LtHcR^mj`yJhPUK3 zTLau^xLPm`UE+lQY7gu{4P%qj05=*I$243mPWTslV25gWQ(m*<05=+Vx3f4b7AO4I zcwmQWI3lmv8sJ6)?`)>w8gatE!~;7_!zb_mOJ1`zz>NmJCrrZ8l-QtA5?13Gq;l0=8HCsbjebB(my=f?m z6aHl$*kKw@Oi}~fXjmT8uuPorFZaL>)bQ><bVF3I7TY>@W?--#IL=*&5(R1K-1@VTCy1U*&-vsNwBb-(=Zmp}}GXjA74wrVfW=R&Q=3?bK*F&6{E=JAHJ*h>B4owT49P%37CH{-^9*rxr$=v#_gkCqH&uz#lQK9 zbtLQ)&NbGoCBo1A4LN|zm1}Wdr`R(Al3Y8C>HW%bu~D+%B^TEVmJ9Tb=9uFdEm};^ zHNG?CGd`}TX`8V_tc&H^K5d>d2OOUt=6D-#^tFAA>6ZGwk_OzDv0kH;op!y3@ts_+ zQ4>Xne7#;%3q|;Ea=nIlb6qhOHf`GE?~VIqGoDyOTP>)Zyv zMlxOd;TRO~fp#0)*v2E%7ktu>>(s7K`t=G!0x|ftP!XPvZFkBB|4(ZnPwISlrli#t zA7T}sbLKmTnA`J6rY|-gcpkZ?ms(uY%$DKChnk;lc&ND`REjfOD#e$CgRO;zQrok_ zaAT>>H63iF{}LUBU%nq0r^#HzHJCPX7rXy2(`LO)d|t)JJlyqi|hMU3nF zh5bV9Sy{*p$mTtT=Uq`XsFg>TYZmseU({L%*WOy!|D~^mj5Ut5j5Rj3+}v1cKGaZY zK2oeS_Z6F3`idjMU9Cro?QMq|+S_h!Y;PNDysMS|lgXitj~<-|`6KtI8xtBs(QNG_ z=N8N4S_tiy7y8>;$V#=7pEbhog$7}zyH9vpZ2_82Pb%-<#aHD~HglV`zobYe(zz)-pTnkCl05=-A z=bMHN;)K8713OSdVl5<11KeofS~U&*;)MT35A0A4WAd6k9^gg;@BgOZMsdQw(E~eB zLt-r?Ee>#_VN*=QMsdQw$pbq~Lvk%7O#|F$xFx1xlQ`kO#REH3!+Y|YoeQ|puvxHN z+#*i+H+x_QYDlbwq{RVlH1OVR8a9g){w*HZVH%QaA!!=mMg#K=reTXX;os_k9jGC( z7Luj`ZZr(UG;9?o`~x1?p&H(j*X;2ypgw5WCRiK>#0md459~kv1a2Ds5MB$$Tn;)H+513OGZaxEk+ z7jUEDwwQ(?al(I_2X>%_#9Bz22Ds6%Bc|atal*gD13Og18}gc+3%Jp6yI{H4Ax`*j z_rMO+kXVOEiv!$f*csDsyEx(B>46=lA-NWkrU7m=?22jFDNguzd0+=>NUVjVX@DCI zcf>U85-0q3cwmQWcuiij#{=AG*e%$2xI>)q@AkkB(~w*XNs9yAXc&%Z*ey=@hdrE^8uRR8II`;^ekl;JR8ZaDT}Qa8Lv0f!aL|HMbWJw_3azw`Qx` zS;u~c4vLTYY1(F7{jaW*SS$)Uhxq&@*YQ)rBH@q1J;L)sPOy3Vvg|%x`<#ET5HEJG z*{w$YCT5?oTX&fq?kAeTU#`E7+2ekuzr46rR)hKgG*FX2Ym3*mUpe%-wqshgjRxvQ zf&8#-h3h2}_6cWmZ{l1jc1=C7cc=e5#93-1R{IqL_)77O}7!=Tk z-!rWr;2%hJ*uAd(kYEx2fs>&F0Is QecJ7&3Kw9gFn+NA3uA79DF6Tf literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-05-realization.png b/docs/openup/analysis-design/uc-05-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..4ccace6709402f5eda5b272c4b551086553a1c78 GIT binary patch literal 22924 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 literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-06-realization.png b/docs/openup/analysis-design/uc-06-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..0c53afec767d3dc5d0b0d864d2c6cd216092068f GIT binary patch literal 22988 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 GCH_BCK)sLv literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-08-realization.png b/docs/openup/analysis-design/uc-08-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cc13630cad7239e0e7d8aaf47d1d70f006f244 GIT binary patch literal 35828 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 Xsq5*U=W~@h7kiYXIRsj`))N0eFrMvB literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-09-realization.png b/docs/openup/analysis-design/uc-09-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..e2528fb1b35005ca2ab917b3c45461f0b27a210d GIT binary patch literal 16492 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 literal 0 HcmV?d00001 diff --git a/docs/openup/analysis-design/uc-10-realization.png b/docs/openup/analysis-design/uc-10-realization.png new file mode 100644 index 0000000000000000000000000000000000000000..a2520ff128d21c424d69314825b5aa831c8707e4 GIT binary patch literal 22860 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 literal 0 HcmV?d00001 diff --git a/scripts/openup/export-diagram-images.ps1 b/scripts/openup/export-diagram-images.ps1 new file mode 100644 index 0000000..75eabdd --- /dev/null +++ b/scripts/openup/export-diagram-images.ps1 @@ -0,0 +1,90 @@ +# Skara Brae — EA diagram image exporter. +# Renders the model's diagrams to PNG for embedding in the OpenUP markdown documents. +# READ-ONLY on the model (opens diagrams, renders, closes; no model mutation). +# +# EA-15 findings baked in (probe session 2026-10-05): +# - the image methods live on ProjectInterface, NOT on Repository +# (Repository.SaveImageToPath exists but always returns False); +# - PutDiagramImageToFile(id, path, type) with type 0 = PNG; +# - the diagram must be OPEN (repo.OpenDiagram) before export, else a blank +# 241x151 stub is written; +# - works with EA hidden (app.Visible = $false). +# +# Output (keyfob-station convention: requirements overview next to the UC docs, +# realization + design figures in analysis-design/): +# docs/openup/requirements/use-case-overview.png +# docs/openup/analysis-design/uc-01-realization.png .. uc-12-realization.png +# docs/openup/analysis-design/component-architecture.png + +$ErrorActionPreference = 'Stop' + +$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path +$modelPath = Join-Path $repoRoot 'docs\openup\model\skara-brae.eapx' +if (-not (Test-Path $modelPath)) { + Write-Output "MISSING $modelPath" + exit 1 +} +$reqDir = Join-Path $repoRoot 'docs\openup\requirements' +$adDir = Join-Path $repoRoot 'docs\openup\analysis-design' +$null = New-Item -ItemType Directory -Force -Path $reqDir, $adDir + +$step = 'start' +$app = $null +$eaBefore = @(Get-Process -Name EA -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Id) + +function Export-Diagram([object]$project, [object]$repo, [int]$diagramId, [string]$outPath) { + if (Test-Path $outPath) { Remove-Item $outPath -Force } + $null = $repo.OpenDiagram($diagramId) + Start-Sleep -Seconds 2 + $null = $project.PutDiagramImageToFile($diagramId, $outPath, 0) + try { $null = $repo.CloseDiagram($diagramId) } catch { } + if (-not (Test-Path $outPath)) { throw "no image written: $outPath" } + $bytes = (Get-Item $outPath).Length + if ($bytes -lt 5000) { throw "suspiciously small render ($bytes bytes): $outPath" } + Write-Output "exported: $outPath ($bytes bytes)" +} + +try { + $app = New-Object -ComObject EA.App + $app.Visible = $false + $repo = $app.Repository + $null = $repo.OpenFile($modelPath) + $root = $repo.Models.GetAt([int]0) + $project = $repo.GetProjectInterface() + + $step = 'use case overview' + $ucModel = $root.Packages.GetByName('Requirements').Packages.GetByName('Use Case Model') + $ucModel.Diagrams.Refresh() + $overview = $ucModel.Diagrams.GetByName('Skara Brae Use Case Overview') + Export-Diagram $project $repo $overview.DiagramID (Join-Path $reqDir 'use-case-overview.png') + + $step = 'realization diagrams' + $analysisDesign = $root.Packages.GetByName('Analysis-Design') + $analysisDesign.Packages.Refresh() + for ($p = 0; $p -lt $analysisDesign.Packages.Count; $p++) { + $pkg = $analysisDesign.Packages.GetAt([int]$p) + if ($pkg.Name -notlike 'UC-?? Realization') { continue } + $pkg.Diagrams.Refresh() + if ($pkg.Diagrams.Count -lt 1) { throw "no diagram in $($pkg.Name)" } + $number = $pkg.Name.Substring(3, 2) + Export-Diagram $project $repo $pkg.Diagrams.GetAt([int]0).DiagramID (Join-Path $adDir ("uc-{0}-realization.png" -f $number.ToLower())) + } + + $step = 'component architecture' + $design = $analysisDesign.Packages.GetByName('Design') + $design.Diagrams.Refresh() + $componentDiagram = $design.Diagrams.GetByName('Component Architecture') + Export-Diagram $project $repo $componentDiagram.DiagramID (Join-Path $adDir 'component-architecture.png') + + $null = $repo.CloseFile() + Write-Output 'EXPORT OK - 14 diagrams rendered' +} +catch { + Write-Output "FAILED at [$step]: $($_.Exception.Message)" + exit 1 +} +finally { + Get-Process -Name EA -ErrorAction SilentlyContinue | + Where-Object { $eaBefore -notcontains $_.Id } | + ForEach-Object { Stop-Process -Id $_.Id -Force } +}