Chapter 7 of 8

Decisions — AtelierBID

The architectural decisions on record and what they mean for you.

AtelierBID records architectural decisions as ADRs (Architecture Decision Records). Each ADR captures one non-obvious decision: the context that forced it, the choice made, the alternatives rejected, and the consequences. ADRs are immutable once accepted — a later decision supersedes an earlier one rather than editing it. The full ADR texts live in the private development repository; the summaries below are the record for adopters.

Read an ADR when you want to understand why something is the way it is, not just what it is. The decisions below are the ones most relevant to adopters and users of the plugin.


Decisions that affect how you use AtelierBID#

Offline floor (ADR-0002)#

The offline file-first path is the default and floor — zero auth, zero network, zero cost. Live read + validate is an optional, user-selected Tier-1 so generation can ground against a real model. Publish and refresh stay manual — instructions only, never executed via APIs.

This means: you can use AtelierBID with no internet connection for all generation and validation. You opt into live schema validation when you need it, and you always publish to Power BI Service yourself.

Export out of scope#

Outputs are file-first text and HTML previews: PBIP/TMDL/PBIR/theme.json, SQL, Mermaid, HTML mockups, and interactive prototypes. PNG, PDF, and PPTX export are out of scope; the generated HTML files are the shareable preview format.

Optional live connectivity (ADR-0008)#

The Tier-1 live override (lifecycle.js --override tier1) flips connectivity for that invocation only and is never persisted. The offline floor is the persistent default; a garbage override fails safe back to offline.


All decisions on record#

All 41 shipped ADRs are accepted. The table is sorted most-recent-first.

ADRTitleDateSummary
ADR-0042Fabric-agent grounds from either a JSON model or a TMDL directory, failing loudly2026-06-30fabric-agent.js --model accepts both a .json model file and a directory of *.tmdl; a missing / empty / invalid model fails loudly rather than silently emitting generic defaults.
ADR-0041fabric-agent runs its CLI on require and scans argv position-independently for the offline harness2026-06-30fabric-agent.js calls main() on module load and parses flags position-independently, so a no-egress harness can require() it to prove zero live calls.
ADR-0040Fabric data-agent config asset is a single deterministic agent-config.json2026-06-30One agent-config.json with a stable, versioned top-level shape (schemaVersion, kind, dataSources, grounding, scope, guardrails, instructions), byte-order sorted and deterministic.
ADR-0039Verified-answer mappings are measure-grounded with a target-must-resolve guard2026-06-30verified-answers pins templated questions to Table[Measure] targets only when the target resolves in the model; de-duped by question so re-runs regenerate cleanly.
ADR-0038Hygiene hides keys via isHidden and disambiguates via displayName (never renames the physical column)2026-06-30Surface hygiene sets isHidden: true on key columns and adds a qualified displayName to cross-table name clashes without renaming the physical column, so relationship-referenced keys keep resolving.
ADR-0037Linguistic-schema shape (entities[] with bindings + terms), Q&A-scoped to exclude keys2026-06-30One entity per table / non-key column / measure, each with a binding to an existing surface plus lowercased terms; key columns excluded to avoid Q&A bloat.
ADR-0036Enrich adds descriptions/synonyms as additive column props; validate-pbip --model accepts a directory2026-06-30enrich injects description:/synonyms: property lines additively and idempotently; validate-pbip.js --model extended to accept a directory of *.tmdl.
ADR-0035AI-readiness reads a model as a TMDL directory and reports gaps in artefact content, not exit code2026-06-30A "model" is a directory of *.tmdl; every sub-command exits 0 and records gaps in artefact content so audit && grep chains keep running.
ADR-0034IR → PBIR conversion targets the PBIR-enhanced format with offline structural fidelity2026-06-30Convert the mockup IR to the PBIR-enhanced format; map visual types via VISUAL_TYPE_MAP (unmapped = warn-and-skip); guard overwrites on a _atelierBidGeneratedBy ownership sentinel; deterministic GUIDs.
ADR-0033Shared mockup-IR schema and floor+remainder grid tiling2026-06-29The mockup IR is self-describing JSON (schemaVersion 1.0, kind atelierbid/mockup-ir), embedded in a script block with </-injection escaping, and additive-only. Floor+remainder grid tiling eliminates visual overlap.
ADR-0032Background descriptor schema + offline PBIP static-resource wiring2026-06-29The background descriptor carries width/height/grid/styleTrace/zones; --pbip writes the resource into StaticResources and references it from report.json.
ADR-0031RAG-separation reserved set is the status roles only; informational excluded2026-06-29The ΔE-guard reserved set is {positive, negative, neutral}; informational (brand-accent blue) is excluded so blue-brand palettes pass the ΔE ≥ 15 guard without false-clashing.
ADR-0030Design-token contract — additive schema, consumers resolve, in-memory parameterisation2026-06-29A formal token schema lives in an additive tokens map; --resolve --set overlays brand params in memory only — the base file is never mutated.
ADR-0029DAX query — emit-only, metadata-in-comments, two-block equivalence pair2026-06-29EVALUATE queries carry human metadata in // comment lines; offline structural validation; an equivalence pair is two labelled EVALUATE blocks.
ADR-0028Offline time-intelligence numeric proxy + partial/prior-period semantics2026-06-29Validate time-intelligence offline against a hand-calculable constant-amount sample.
ADR-0027Fiscal-year naming and week-calendar semantics2026-06-29Fiscal year is named by its ending calendar year; ISO-8601 Monday-start is the default week calendar.
ADR-0026Marked date table as a calculated CALENDAR() table, contiguity proven offline2026-06-29The date table is emitted as a calculated CALENDAR() table marked dataCategory: Time; contiguity proven offline by a leap-day-aware UTC day-walk.
ADR-0025DAX write-back safety gate + offline equivalence verdict2026-06-29Write-back gated behind an explicit --apply (dry-run by default); the offline verdict reports engine: none rather than claiming false equivalence.
ADR-0024Equivalence-preserving DAX rewrite set + equivalence-id tagging2026-06-29Only a closed set of transforms that are equivalence-preserving by construction are applied; every rewrite is tagged with an equivalence id.
ADR-0023Marked-date-table resolution precedence for time-intelligence binding2026-06-29Precedence: contract + exactly one marked table → bind; contract + zero/many marked → fail loudly; absent → fall back to the convention 'Date'[Date].
ADR-0022Measure/calc-group TMDL emit shape + measure-aware validator2026-06-29A sibling emitter writes measure and calculationGroup TMDL blocks; the measure-aware validator requires tab indentation, correct nesting, and non-empty expressions.
ADR-0021Optimiser auto-fix — safe fix set + offline before/after equivalence gate2026-06-29Only autofix: safe findings are written, via deterministic idempotent text edits, behind a result-preservation gate.
ADR-0020Model optimiser — read-only static scan + numeric severity ranking2026-06-29The optimiser scans TMDL read-only and ranks findings by a numeric severity with a stable tie-break.
ADR-0019Incremental refresh — emit-only refreshPolicy + M-fold heuristic2026-06-29Emits refreshPolicy, RangeStart/RangeEnd params and a foldable filter; a static M-text fold heuristic flags bare-vs-wrapped columns.
ADR-0018Partitioning — row-threshold recommendation, IR-template partition2026-06-29A deterministic recommendation (1M+ rows + a date-like grain) drives partitioning; the date range is emitted as an IR-template partition.
ADR-0017Uniform column grouping — name-inferred kinds + catalogue fallback2026-06-29Column grouping kind is inferred from the column name; the member list comes from a --tables dir or a built-in catalogue fallback; an unknown group fails loudly.
ADR-0016Role-playing dimensions — one active relationship + USERELATIONSHIP hint2026-06-26Exactly one active relationship per (fact, dimension) pair is emitted, with inactive relationships carrying USERELATIONSHIP hints.
ADR-0015Relationships inferred by shared-key naming, star-safe defaults2026-06-26Relationships are inferred from shared-key naming with star-safe many→one defaults; bidirectional is opt-in and warned.
ADR-0014Star-schema modelling — emit-only, heuristic NL parser, structural TMDL2026-06-26A heuristic NL parser (closed grammar) emits star/flat/dimension-only TMDL; offline structural TMDL validation proxies "opens in Desktop".
ADR-0013M authoring — emit-only, structural validation, fold heuristic, Value.NativeQuery IR wrapping2026-06-26author-m.js writes review-only M with no mashup engine; fold-breaks are flagged (warn-don't-fail).
ADR-0012SQL authoring — emit-only, context-selects-emitter, offline static parse2026-06-26author-sql.js writes review-only SQL with no DB driver and no execution path.
ADR-0011Discovery gap detection — additive gaps[] + stdout, non-fatal exit2026-06-25--check-gaps reports holes as an additive gaps[] field and exits 0 — a gap is a warning, not a failure.
ADR-0010Discovery trace ids — additive REQ-NNN array, opt-in and deterministic2026-06-25--trace stamps every captured item with a stable REQ-NNN id, assigned in fixed bucket-walk order so re-runs are byte-identical.
ADR-0009Discovery requirements spec — fixed-order JSON schema, deterministic2026-06-25The discovery spec is a fixed-key-order JSON document serialised deterministically; identical inputs yield byte-identical specs.
ADR-0008Tier-1 connectivity override is per-invocation, never persisted2026-06-25lifecycle.js --override tier1 flips connectivity for that run only; the offline floor is the persistent default.
ADR-0007Sanitise unsafe characters but refuse path traversal in project names2026-06-25new-project.js sanitises unsafe characters into a safe folder token but refuses .. path traversal.
ADR-0006Merged measures host in a dedicated _Measures table2026-06-19Generated measures are hosted in a dedicated _Measures table, never a table named after the measure.
ADR-0005Ship a minimal inline TMDL bootstrap early to unblock schema grounding2026-06-19A minimal inline TMDL bootstrap was shipped early in ground-schema.js before the full extraction bootstrap; the full version followed subsequently.
ADR-0004PBIP structural baseline, offline determinism, validator-as-Desktop-proxy2026-06-19A single requiredParts list drives both scaffolder and validator; emission is deterministic; the structural validator proxies "opens in Power BI Desktop".
ADR-0003XL build phases kept un-split; each phase delivered feature-by-feature2026-06-18The larger build phases (01, 03, 05) are kept as single units delivered feature-by-feature — each feature is the 1–2-week deliverable — rather than further sub-divided.
ADR-0002Optional live connectivity as Tier-1 above an offline floor; publish stays manual2026-06-18The offline file-first path is the default and floor. Live read + validate is an optional Tier-1. Publish / refresh stay manual.

See Architecture for how these decisions shape the system, and Features for the capabilities they govern.