Skip to content

Bring the EMF implementation level with 1.0.0 in one change #666

Closed

Description

@ExtraToast

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:

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

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.

Activity

  1. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    What the Task 3 report (#98) needs from this PR

    The report is drafted (Overleaf project 6ae33bae3afd0f952d331ed6) and describes emf/ as level with 1.0.0. Its mirror under docs/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

    1. The templates choose nothing (maintainer, 2026-10-29: move the exceptions into the model). Each becomes a Resolved Deployment feature that resolution.qvto derives and the template only writes, with the output bytes unchanged:
      • allowsAt: the capability read for 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;
      • the -primary suffix of a blue-green Process's Deployment, spelled in two templates.
    2. Render the four families main's oracles carry and render.mtl does not: route annotations; the Canary's rollback webhook; the Middleware family (edge's traefik-lan/middlewares.yaml); GrafanaDashboard (data's platform-rabbitmq/dashboards.yaml).
    3. Add edge to RENDERED_CASES in ParityTest.kt, so the parity rows cover minimal, data and edge.
    4. Remove the handover remnants: the estate-scoped shared index template and its allInstances query in render.mtl, the matching Javadoc in Rendering.java, and the passages in emf/docs/architecture.md.
    5. Correct 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 writes version: "1.1"); the emf job is not in Pipeline Complete.

    Worth fixing while there (otherwise the report states them as limitations)

    • No E_PATH_COLLISION check on the EMF side, only E_ALIAS_COLLISION.
    • The yaml dispatch has no else: an unknown kind writes a file holding only the header.
    • A failed run leaves the files already written, although Rendering's Javadoc says otherwise.
    • middlewareName maps a redirect step to security-headers as well.
    • scalar does not quote a trailing colon (edge's CSP value ending in https:).
    • Comment blocks sit above the wrong templates near lines 993, 1902 and 1918 of render.mtl.
    • backupRanges joins a CIDR and a port into one string that the template splits again.

    After it lands, for the report

    • Fill the pending values: files written per case, parity, second-run determinism, RenderedTreeTest, the JaCoCo and PIT floors, the template and query counts, and the appendix's feature names.
    • Redraw the worked-example and template-structure figures where the moved choices and the new families change them, and draw the four metamodel figures from the caught-up .ecore files.
    • Build the hand-in with docs/mde/task-3-code-generation/handin/build.py after ./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 restricted finds 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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: featureNew user-facing or operator-facing capability.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions