Repository navigation
Labels
type: featureNew user-facing or operator-facing capability.New user-facing or operator-facing capability.
Description
Part of #78.
What to build
Once 1.0.0 is published and every shape it carries is known, bring the model-driven EMF implementation (emf/) level with the TypeScript implementation in one PR. Not piece by piece, and not while TypeScript is still changing (the maintainer, 2026-10-27).
The shapes TypeScript gained since EMF last kept pace, which the PR should cover:
- the Move:
moveon a resolved Process,instance, Processrollback, the ClusterState Instancetarget,name,phaseandflippedAt, thedelivery.movepolicy, an engine'smovemethod, and the refusals E_MOVE_*, E_NO_MOVE_POLICY and E_FORWARD_ONLY_UNUSED (Derive a Move in layer 2, with a hand-written Postgres 16 to 17 example #333, Render a Move: its step Jobs, its move identity and policy for both Instances #335, Move an Application between Projects by declaring it in the new one first #334); - Stable Addresses (feat(model): derive and render the Stable Address, and point every alias at it #646), and
departingdeclarations (Move an Application between Projects by declaring it in the new one first #334); - sidecar
volumesandinit(feat(model): let a sidecar mount the Process's volumes it names, and run before it as an init step #651, E_UNKNOWN_SIDECAR_VOLUME); - spawn templates (feat(model): let a Process create pods only from a spawn template it declares #641),
apirules withscope: namespace, andapiAccess.namespaceHolders(feat(model): scope an api rule to its Process's namespace or the cluster #640), and anapiblock with no rules (feat(model): reach the Kubernetes API without holding a rule #643); - the
s3engine,catalogSurface,bucketson an edge and the bucket catalog (feat(model): derive a bucket catalog from the edges into an object store #647); backupsandrollback-backupremoved (feat(model)!: drop the rollback-backup annotation and the snapshot's backups list #652);- everything else in the 1.0.0 CHANGELOG.
Acceptance criteria
- EMF parses, checks and resolves every worked example to the same intent, effective and dependencies oracles TypeScript writes.
- EMF's own test suite passes.
- One PR, opened only after 1.0.0 is published.
Blocked by
- Cut what the map cut and release package 1.0.0 #379 (1.0.0 published)
Resume here (2026-10-27)
State: not started; waiting for 1.0.0.
Next step: when the release session reports 1.0.0 published, read the 1.0.0 CHANGELOG and diff spec/v1/schemas against the last commit that touched emf/. That gives the list of shapes to carry.
Gotchas: until this PR, no change touches emf/ or docs/mde, and no change deletes a golden EMF reads.
Metadata
Metadata
Assignees
Labels
type: featureNew user-facing or operator-facing capability.New user-facing or operator-facing capability.
Activity
ExtraToast commentedon Oct 29, 2026
What the Task 3 report (#98) needs from this PR
The report is drafted (Overleaf project
6ae33bae3afd0f952d331ed6) and describesemf/as level with 1.0.0. Its mirror underdocs/mde/task-3-code-generation/is held until this PR lands, per the gotcha above. Each item below is a claim the report makes, or a value it holds pending, that only this PR can make true.Must land here
resolution.qvtoderives and the template only writes, with the output bytes unchanged:allowsAt: the capabilityreadfor a Vault path with no entry;catalogAllows: a catalog path's capabilities, chosen by its prefix;middlewareName: a security profile's name, by content policy, with an unsuffixed fallback;rateLimitName: numbered by the route's position;-primarysuffix of a blue-green Process's Deployment, spelled in two templates.render.mtldoes not: route annotations; the Canary'srollbackwebhook; theMiddlewarefamily (edge'straefik-lan/middlewares.yaml);GrafanaDashboard(data'splatform-rabbitmq/dashboards.yaml).edgetoRENDERED_CASESinParityTest.kt, so the parity rows coverminimal,dataandedge.allInstancesquery inrender.mtl, the matching Javadoc inRendering.java, and the passages inemf/docs/architecture.md.emf/docs/architecture.md: "Three QVT-Operational transformations" is two; the quoting rule is YAML 1.1, not the 1.2 core schema (the TypeScript serializer also writesversion: "1.1"); theemfjob is not inPipeline Complete.Worth fixing while there (otherwise the report states them as limitations)
E_PATH_COLLISIONcheck on the EMF side, onlyE_ALIAS_COLLISION.yamldispatch has noelse: an unknown kind writes a file holding only the header.Rendering's Javadoc says otherwise.middlewareNamemaps aredirectstep tosecurity-headersas well.scalardoes not quote a trailing colon (edge's CSP value ending inhttps:).render.mtl.backupRangesjoins a CIDR and a port into one string that the template splits again.After it lands, for the report
RenderedTreeTest, the JaCoCo and PIT floors, the template and query counts, and the appendix's feature names..ecorefiles.docs/mde/task-3-code-generation/handin/build.pyafter./mvnw clean verify.Already measured on main's committed trees, which this PR's output must equal byte for byte: kubeconform 0.6.7 at Kubernetes 1.36.5 accepts 16/16, 89/89 and 39/39 resources; Pod Security
restrictedfinds nothing; a server dry-run on k3s v1.36.5 accepts all 107 indexed objects and all 19 network policies (#685 moves the schema check to 1.36.5).