From 0ad4a423380ace6097cb89a580522b60cae1c177 Mon Sep 17 00:00:00 2001 From: Joris Wouter Jonkers Date: Wed, 16 Sep 2026 20:30:29 +0200 Subject: [PATCH] docs: correct the proposal's delivery, output layout and platform data #56's remaining items, the ones #101 and #102 did not already supersede. Every edit was made in Overleaf and mirrored back, because the mirror is never the source; a diff against the project reports no differences either way. **Delivery.** The proposal said release CI applies the resources with `kubectl apply -k`, which is a local imperative command standing in for a decision this project does not make. How a Deliverable Set reaches a cluster is defined separately from the model, so the text now says that plainly: the model states what should be true and what must be applied before what, and whether a pipeline applies it directly or a cluster-side reconciler consumes the pipeline's published output is a choice the specification is written to survive either way. **Output layout.** It said one Deliverable Set per application, which is the shape the model rejected: there is one tree for the estate, laid out per project and application by the path plan the resolved model carries, produced by six generators each run once over the whole composed input. That last part is not decoration; it is what lets a value one application derives from another be computed in one place. **Platform data.** The inputs paragraph named "naming and label rules, defaults, ingress and storage classes, the alert catalogue and cluster capabilities". Three of those do not exist. There is no alert catalogue, because PromQL belongs to the monitoring stack; no storage classes, because every volume takes the cluster default; and no naming rules left to state. The paragraph now names the pinned input set the model actually closes over, each input carried by digest. "Monitoring rules" became "monitor targets" in the next paragraph for the same reason. **The numbers were stale.** `auth` produces eleven files of about 620 lines, not ten files of about 890. The coursework README's task table gains the three deadlines, the Task 1 Overleaf project and directory that now exist, and a line saying the module table under `emf/` carries the same task numbering, so the two are read together rather than restating each other. --- docs/mde/README.md | 18 ++++++--- .../task-0-proposal/Sections/02-solution.tex | 38 ++++++++++++------ .../Sections/04-generated-code.tex | 13 +++--- docs/mde/task-0-proposal/main.pdf | Bin 103090 -> 100038 bytes 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/docs/mde/README.md b/docs/mde/README.md index 74682ee..083541e 100644 --- a/docs/mde/README.md +++ b/docs/mde/README.md @@ -12,12 +12,18 @@ reviewer can read without an Overleaf account. One directory per deadline, named after the course's own task numbering. -| Directory | Deliverable | Overleaf project | State | -|---|---|---|---| -| [`task-0-proposal/`](task-0-proposal/) | Task 0 — project description, the proposal that must be approved before work starts | `6aa2ba0c3920baa59ec20901` | re-mirrored 2026-09-14, after the simplification in #102 | -| `task-1-metamodelling/` | Task 1 — domain analysis and modelling decisions for the two metamodels, **Project Intent** (source) and **Resolved Deployment** (target), their diagrams and example models | — | not started | -| `task-2-transformations/` | Task 2 — the model-to-model transformation from **Project Intent** (resolved against the Platform document) to **Resolved Deployment**, its rules and limitations, evidence it runs | — | not started | -| `task-3-code-generation/` | Task 3 — the model-to-text transformation from **Resolved Deployment** to the Deliverable Set, the generated code, evidence it loads | — | not started | +| Directory | Due | Deliverable | Overleaf project | State | +|---|---|---|---|---| +| [`task-0-proposal/`](task-0-proposal/) | approved | Task 0 — project description, the proposal that must be approved before work starts | `6aa2ba0c3920baa59ec20901` | re-mirrored 2026-09-16, after the delivery and output-layout corrections in #56 | +| [`task-1-metamodelling/`](task-1-metamodelling/) | 2026-09-25 | Task 1 — domain analysis and modelling decisions for the two metamodels, **Project Intent** (source) and **Resolved Deployment** (target), their diagrams and example models | `6aaa9f1d3920baa59ec267f7` | drafted; both metamodels exist as Ecore under [`emf/bundles/metamodel/model/`](../../emf/bundles/metamodel/model/) | +| `task-2-transformations/` | 2026-10-16 | Task 2 — the model-to-model transformation from **Project Intent** (resolved against the Platform document) to **Resolved Deployment**, its rules and limitations, evidence it runs | — | not started | +| `task-3-code-generation/` | 2026-10-30 | Task 3 — the model-to-text transformation from **Resolved Deployment** to the Deliverable Set, the generated code, evidence it loads | — | not started | + +Each task delivers an EMF artefact, and the table above says which directory +documents it. What the artefact *is* lives in +[`emf/docs/architecture.md`](../../emf/docs/architecture.md#modules), whose +module table carries the same task numbering, so the two are read together and +neither restates the other. Add a new report as a sibling directory with the same internal shape, and fill in its row above when its Overleaf project exists. diff --git a/docs/mde/task-0-proposal/Sections/02-solution.tex b/docs/mde/task-0-proposal/Sections/02-solution.tex index 6907c58..d62891a 100644 --- a/docs/mde/task-0-proposal/Sections/02-solution.tex +++ b/docs/mde/task-0-proposal/Sections/02-solution.tex @@ -8,21 +8,33 @@ \section{Solution} The project objective is to define this abstract model and the transformations that turn it into a complete set of deployment YAML and JSON files. -For each release, CI gives the generator three inputs: the Project Intent -model, per-process environment files and an image lock that maps image names -to pinned digests. It also receives versioned platform data, including naming -and label rules, defaults, ingress and storage classes, the alert catalogue -and cluster capabilities. The generator uses only these inputs. It does not -read live cluster state or access secret values. +For each release the generator is given a closed set of inputs, every one of +them carried by digest: each project's own model with its per-process +environment files, one platform document stating what the estate offers, a +contract publishing what each machine can hold, an image lock mapping image +names to pinned digests, and a snapshot of the few cluster facts nothing else +can supply, such as which machine already holds a volume. The generator reads +these and nothing else. It does not read live cluster state and it does not +access secret values. A model-to-model transformation turns these inputs into a \emph{Resolved Deployment}. This complete, non-text model contains exact resource names, namespaces, paths, image digests, replicas, resources, probes, ports, addresses, -policy peers, routes, secret references and monitoring rules. Renderers -only turn this model into files and make no deployment decisions. +policy peers, routes, secret references and monitor targets. Renderers only +turn this model into files and make no deployment decisions. -The model-to-text step generates a \emph{Deliverable Set} for each application. -It contains a \texttt{kustomization.yaml}, Kubernetes YAML files and policy JSON -files. After validation, release CI applies the Kubernetes resources with -\texttt{kubectl apply -k}. Platform facts come from one central, versioned -source, so every repository uses the same platform definition. +The model-to-text step generates one \emph{Deliverable Set} for the estate: +Kubernetes YAML, policy JSON and the index files that group them, laid out per +project and application by a plan the resolved model carries, so every file's +path is a decision recorded in the model rather than one a generator makes +while writing. Six generators produce it, each run once over the whole +composed input rather than once per application, which is what lets a value +one application derives from another be computed in one place. + +How that set reaches a cluster is deliberately outside this project. The model +states what should be true and what must be applied before what; whether a +pipeline applies it directly or a cluster-side reconciler consumes the +pipeline's published output is a separate decision, and the specification is +written so that either can be chosen without changing it. Platform facts come +from one central, versioned source, so every repository resolves against the +same platform definition. diff --git a/docs/mde/task-0-proposal/Sections/04-generated-code.tex b/docs/mde/task-0-proposal/Sections/04-generated-code.tex index b08db8d..fdb3683 100644 --- a/docs/mde/task-0-proposal/Sections/04-generated-code.tex +++ b/docs/mde/task-0-proposal/Sections/04-generated-code.tex @@ -1,8 +1,10 @@ \section{Generated Code} \label{sec:generatedcode} -The generator creates one versioned Deliverable Set per application. -Table~\ref{tab:generated_resources} lists its resources and how they are derived. +The generators create one versioned Deliverable Set for the estate, laid out +per project and application by the path plan the resolved model carries. +Table~\ref{tab:generated_resources} lists its resources and how they are +derived. \begin{table}[!htbp] \centering @@ -30,7 +32,8 @@ \section{Generated Code} \end{table} The transformation computes limits, startup probes, route precedence and policy -peers. For \texttt{auth}, about 90 source lines produce ten files with about 890 +peers. For \texttt{auth}, 96 declared lines produce eleven files of about 620 lines. The repository contains hand-written expected files, which are used to -check the generated result. CI receives one Kustomize entry point for the -complete bundle. +check the generated result. The tree carries one index entry point at its root, +so the whole estate is applied through a single reference rather than one per +application. diff --git a/docs/mde/task-0-proposal/main.pdf b/docs/mde/task-0-proposal/main.pdf index 0e275ef3aeb5a4919c13ffea4c918cd0c002c306..222690ce15ed02414f43c6bbf5fa8bb692777a7b 100644 GIT binary patch delta 16581 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 delta 18532 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