Skip to content

docs: scope three-way merge to TypeScript and state port baselines and gaps - #473

Merged
dmealing merged 4 commits into
mainfrom
fm/mo-port-docs-fit-fixes
Oct 28, 2026
Merged

dmealing merged 4 commits into
mainfrom
fm/mo-port-docs-fit-fixes

Conversation

@dmealing

Copy link
Copy Markdown
Member

What Changed

  • Each port page (docs/ports/*.md) and docs/llms/llms-full.txt now include a keep-your-ORM path: TypeScript runtime: false (Zod and types, no Drizzle), Java and Kotlin DTO and value-object records alongside a hand-written JPA entity, sourceless C# POCOs, and Pydantic models in Python.
  • Three-way merge is scoped to TypeScript in the feature docs (codegen-data-shapes.md, migrations-and-drift.md, own-your-codegen.md), AGENTS.md, docs/llms/llms.txt, and the CLI README. The other ports document their hash-manifest refusal and eject behavior.
  • docs/ports/java.md states the baselines (Java 21 and Spring Boot 3.x; Boot 2 and javax.* unsupported) and each port page links its known gaps. docs/ports/typescript.md now leads with running on Node, with Bun second. CHANGELOG.md gets an Unreleased Docs entry.
Validation

Risk Assessment

✅ Low: Docs-only change. I checked the factual claims against source and they hold: Java 21 baseline, .NET 8, Kotlin 2.0.21, the eject and handEdits plugin options, the KNOWN_GAPS paths and the runtime:false target option. The only defect was one garbled sentence, fixed inline.

Testing

Docs-only change, so I drove the doc claims against the real tools in disposable projects. Live passes: the TS contract-only target writes Zod and types with no drizzle or runtime-ts import; a sourceless C# entity generates a DataAnnotations POCO with no EF mapping; C# and Python refuse an edited generated file by name instead of merging. The Java 21, Kotlin 2.0.21, .NET 8 and handEdits keep/overwrite statements were checked only by reading build files and mojo code; I did not run Java or Kotlin codegen live, nor mvn metaobjects:eject. The repo's ci-local.sh --quick passed. The C#, Java, Python and Kotlin conformance lanes are skipped by --quick and were not run. Throwaway projects remain under the evidence dir; worktree is clean.

  • Live validation: ✅ go - 5 of 6 scenarios driven live against the product
Scenario Result Live Evidence
TS adopter sets a target to runtime: false, ejects entity, runs meta gen: output is Zod + types with no drizzle-orm or runtime-ts import ✅ pass live ts-proj/src/contract/Author.ts; grep for drizzle|runtime-ts found nothing
C# adopter declares an entity with no source.rdb, runs dotnet meta gen: a POCO with DataAnnotations and no [Table]/DbSet is written ✅ pass live cs-proj/src/Generated/AuthorSummary.g.cs; SourcelessEntityGatesTests 9/9
C# hand-edit then regen: file refused by name, no three-way merge (matches csharp.md) ✅ pass live dotnet meta gen output: 'refused: AuthorSummary.g.cs ... 0 file(s) written'
Python metaobjects gen entity generator writes Pydantic models with no ORM; hand-edited file refused on regen ✅ pass live py-proj/generated/AuthorSummary.py; 'Refused to overwrite AuthorSummary.py'
Java/Kotlin baselines (Java 21, Kotlin 2.0, JVM 21) and handEdits keep/overwrite policy match the build config ⏸️ untested no Prior payload did not establish a live result: Maven generate on a Java/Kotlin project was not run, and mvn metaobjects:eject was not run. Claims were checked only by reading java/pom.xml, codegen-k…
Known-gaps links on each port page and the llms/CHANGELOG/feature-doc edits resolve and the repo doc gates stay green ✅ pass live All four KNOWN_GAPS.md targets exist; ci-local --quick passed (shipped doc examples load, doc-template drift, site payload)
Evidence: ci-local --quick log
metaobjects local CI  (mode: quick — TS + drift gates only)

── ▶ leak-scan (security) ──────────────────────────────────────────────
leak-scan: clean
── ✓ leak-scan (security) (0s)

── ▶ pom-version parity ──────────────────────────────────────────────
check-pom-versions: ✓ 3 parent + 1 property pom(s) match reactor 8.1.4
── ✓ pom-version parity (0s)

── ▶ bun-version parity ──────────────────────────────────────────────
check-bun-version: bun 1.3.14 matches the workflow pin.
── ✓ bun-version parity (0s)

── ▶ uv.lock version parity ──────────────────────────────────────────────
check-uv-lock-version: uv.lock agrees with pyproject.toml (1.1.4)
── ✓ uv.lock version parity (0s)

── ▶ publish-intent parity ──────────────────────────────────────────────
publish-intent parity: OK (lockstep 1.1.4; 2 declared source-only)
── ✓ publish-intent parity (0s)

── ▶ publish-set parity ──────────────────────────────────────────────
   1. @metaobjectsdev/metadata  (server/typescript/packages/metadata)
   2. @metaobjectsdev/render  (server/typescript/packages/render)
   3. @metaobjectsdev/docs-site  (server/typescript/packages/docs-site)
   4. @metaobjectsdev/codegen-ts  (server/typescript/packages/codegen-ts)
   5. @metaobjectsdev/runtime-ts  (server/typescript/packages/runtime-ts)
   6. @metaobjectsdev/migrate-ts  (server/typescript/packages/migrate-ts)
   7. @metaobjectsdev/sdk  (server/typescript/packages/sdk)
   8. @metaobjectsdev/runtime-web  (client/web/packages/runtime-web)
   9. @metaobjectsdev/codegen-ts-react  (server/typescript/packages/codegen-ts-react)
  10. @metaobjectsdev/codegen-ts-tanstack  (server/typescript/packages/codegen-ts-tanstack)
  11. @metaobjectsdev/react  (client/web/packages/react)
  12. @metaobjectsdev/tanstack  (client/web/packages/tanstack)
  13. @metaobjectsdev/cli  (server/typescript/packages/cli)
  14. @metaobjectsdev/ai-runtime  (server/typescript/packages/ai-runtime)
publish set: OK (lockstep 1.1.4; 14 packages, tier-ordered, closed over sibling deps)
ok:   happy path: private + off-lockstep excluded, order [metadata, render, docs-site, cli]
ok:   untiered member: threw on "publish order undeclared"
ok:   unclosed set: threw on "not closed over its own runtime dependencies"
ok:   inverted tier order: threw on "publishes a dependency AFTER its dependent"
ok:   regression: docs-site (#2) publishes before cli (#12) in the real tree
ok:   regression: docs-site has a declared tier

publish-set tests: all passed
── ✓ publish-set parity (0s)

── ▶ no committed pre-release version ──────────────────────────────────────────────
check-no-prerelease-versions: ✓ no pre-release version in any version declaration
── ✓ no committed pre-release version (0s)

── ▶ script-name hook collisions ──────────────────────────────────────────────
script-name-hooks: ✓ 10 root scripts, no lifecycle-hook collisions
── ✓ script-name hook collisions (1s)

── ▶ ci lane selection ──────────────────────────────────────────────
ok:   [server/typescript/packages/cli/src/x.ts] -> 'ts'
ok:   [client/web/packages/react/src/y.tsx] -> 'ts'
ok:   [server/java/metadata/src/main/java/A.java] -> 'java'
ok:   [server/java/codegen-kotlin/src/main/kotlin/B.kt] -> 'java'
ok:   [server/python/src/metaobjects/loader.py] -> 'python'
ok:   [server/csharp/MetaObjects/Loader.cs] -> 'csharp'
ok:   [fixtures/conformance/foo/meta.json] -> 'ts java python csharp'
ok:   [spec/metamodel.md] -> 'ts java python csharp'
ok:   [scripts/ci-local.sh] -> 'ts java python csharp'
ok:   [.github/workflows/local-ci.yml] -> 'ts java python csharp'
ok:   [agent-context/skills/x.md] -> 'ts java python csharp'
ok:   [weird-new-toplevel/file.txt] -> 'ts java python csharp'
ok:   [docs/features/cli.md] -> ''
ok:   [README.md CHANGELOG.md] -> ''
ok:   [server/typescript/a.ts server/python/b.py] -> 'ts python'
ok:   [docs/x.md fixtures/y.json] -> 'ts java python csharp'
ALL PASS
ok:   union all -> 'ts java python csharp'
ok:   union reorders to canonical -> 'ts java python csharp'
ok:   union deduplicates -> 'ts java'
ok:   union single -> 'python'
ok:   union empty -> ''
ok:   union drops unknown tokens -> 'ts'
ok:   every lane green -> nothing to re-run -> ''
ok:   docs-only run skips a red java -> java still not green -> 'java'
ok:   one red ts lane selects the whole ts port -> 'ts'
ok:   skipped is walked past to the real verdict -> ''
ok:   cancelled is not green -> 'csharp'
ok:   a lane with no verdict in the window is not green -> 'python'
ok:   no history at all -> everything -> 'ts java python csharp'
ok:   every port-testing job in .github/workflows/local-ci.yml is mapped by lane_port -> ''
ok:   every lane in lane_port exists as a job in .github/workflows/local-ci.yml -> ''
all checks passed
── ✓ ci lane selection (0s)

── ▶ extract field kinds ──────────────────────────────────────────────
extract FieldKind: 4 ports agree on [STRING, INT, LONG, DOUBLE, BOOLEAN, ENUM, OBJECT] (1 sanctioned deviation(s): csharp)
── ✓ extract field kinds (0s)

── ▶ no-magic gate wired (5 ports) ──────────────────────────────────────────────
no-magic gate coverage: 5 ports wired; 13 shapes tracked, 0 known gaps
── ✓ no-magic gate wired (5 ports) (0s)

── ▶ test-file references resolve ──────────────────────────────────────────────
test-file references: 32 named, all resolve
── ✓ test-file references resolve (0s)

── ▶ metamodel-version bump ──────────────────────────────────────────────
  metamodel-version: none change since v1.1.4; declared 1.2 — ok.
ok:   no change classifies as nothing
ok:   a removed subtype is BREAKING
ok:   an added subtype is ADDITIVE
ok:   a removed attr is BREAKING
ok:   an added OPTIONAL attr is ADDITIVE
ok:   an added REQUIRED attr is BREAKING
ok:   optional → required is BREAKING
ok:   required → optional is ADDITIVE
ok:   a changed valueType is BREAKING
ok:   a changed isArray is BREAKING
ok:   an enum member REMOVED is BREAKING
ok:   an enum member ADDED is ADDITIVE
ok:   an OPEN attr becoming a closed enum is BREAKING
ok:   a closed enum OPENING is ADDITIVE
ok:   a removed child rule is BREAKING
ok:   an added OPTIONAL child rule is ADDITIVE
ok:   an added MANDATORY child rule is BREAKING
ok:   raising min is BREAKING
ok:   lowering min is ADDITIVE
ok:   capping an unbounded max is BREAKING
ok:   lifting a cap is ADDITIVE
ok:   lowering a finite max is BREAKING
ok:   a removed commonAttr is BREAKING
ok:   a changed default subtype is BREAKING (it changes what an unqualified declaration MEANS)
ok:   a removed default subtype is BREAKING
ok:   an added default subtype is ADDITIVE
ok:   a type description change is PROSE ONLY
ok:   a `rules` change is PROSE ONLY — this is exactly #210, and why prose only warns
ok:   an attr description change is PROSE ONLY
ok:   no change requires no bump
ok:   additive requires a minor
ok:   post-1.0 br

... [462507 bytes truncated] ...

f)) {
+       if (true) {

[Survived] ConditionalExpression
src/super-resolve.ts:295:11
-         if (parsed !== undefined) {
+         if (true) {

[Survived] ConditionalExpression
src/super-resolve.ts:297:13
-           if (ownerNode !== undefined && ownerNode !== "over-drop") resolveNode(ownerNode);
+           if (true) resolveNode(ownerNode);

[Survived] LogicalOperator
src/super-resolve.ts:297:13
-           if (ownerNode !== undefined && ownerNode !== "over-drop") resolveNode(ownerNode);
+           if (ownerNode !== undefined || ownerNode !== "over-drop") resolveNode(ownerNode);

[Survived] ConditionalExpression
src/super-resolve.ts:297:13
-           if (ownerNode !== undefined && ownerNode !== "over-drop") resolveNode(ownerNode);
+           if (true && ownerNode !== "over-drop") resolveNode(ownerNode);

[Survived] ConditionalExpression
src/super-resolve.ts:297:40
-           if (ownerNode !== undefined && ownerNode !== "over-drop") resolveNode(ownerNode);
+           if (ownerNode !== undefined && true) resolveNode(ownerNode);

[Survived] StringLiteral
src/super-resolve.ts:297:54
-           if (ownerNode !== undefined && ownerNode !== "over-drop") resolveNode(ownerNode);
+           if (ownerNode !== undefined && ownerNode !== "") resolveNode(ownerNode);

[Survived] ObjectLiteral
src/super-resolve.ts:332:19
-             target: { type: target.type, subType: target.subType },
+             target: {},

[Survived] ObjectLiteral
src/super-resolve.ts:333:21
-             referrer: { type: node.type, subType: node.subType },
+             referrer: {},

[Survived] StringLiteral
src/super-resolve.ts:351:15
-           kind: "unresolved",
+           kind: "",

Ran 0.99 tests per mutant on average.
--------------------|------------------|----------|-----------|------------|----------|----------|
                    | % Mutation score |          |           |            |          |          |
File                |  total | covered | # killed | # timeout | # survived | # no cov | # errors |
--------------------|--------|---------|----------|-----------|------------|----------|----------|
All files           |  54.62 |   54.62 |      949 |        15 |        801 |        0 |        0 |
 parser-core.ts     |  45.50 |   45.50 |      475 |         0 |        569 |        0 |        0 |
 provider.ts        |  61.54 |   61.54 |       39 |         1 |         25 |        0 |        0 |
 serializer-json.ts |  64.49 |   64.49 |      197 |        10 |        114 |        0 |        0 |
 subtype-rules.ts   |  69.23 |   69.23 |      117 |         0 |         52 |        0 |        0 |
 super-resolve.ts   |  75.30 |   75.30 |      121 |         4 |         41 |        0 |        0 |
--------------------|--------|---------|----------|-----------|------------|----------|----------|
�[32m00:18:05 (509697) INFO MutationTestReportHelper�[39m Final mutation score of 54.62 is greater than or equal to break threshold 35
�[32m00:18:05 (509697) INFO HtmlReporter�[39m Your report can be found at: file://~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/metadata/reports/mutation/mutation.html
�[32m00:18:05 (509697) INFO MutationTestExecutor�[39m Done in 5 minutes and 49 seconds.
── ✓ completeness-gate (mutation) (5m50s)

── ▶ doc-template drift ──────────────────────────────────────────────
synced: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates/docs/entity-page.md.mustache -> ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/templates/docs/entity-page.md.mustache
synced: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates/docs/template-page.md.mustache -> ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/templates/docs/template-page.md.mustache
synced: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates/api/agent-api.md.mustache -> ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/templates/api/agent-api.md.mustache
synced: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates/api/entity-api.md.mustache -> ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/templates/api/entity-api.md.mustache
synced: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates/api/index.md.mustache -> ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/templates/api/index.md.mustache
generated ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/server/typescript/packages/codegen-ts/src/render-engine/embedded-templates.generated.ts (5 template(s): api/agent-api.md, api/entity-api.md, api/index.md, docs/entity-page.md, docs/template-page.md)
doc templates synced from canonical root: ~/.no-mistakes/worktrees/5b8c6c97e760/01M607FFFDTD1H9P6G9JY51T5R/templates (docs api)
── ✓ doc-template drift (0s)

── ▶ embedded-library drift ──────────────────────────────────────────────
wrote 6 embedded library file(s) + 2 manifest(s) to server/typescript/packages/metadata/src/library/embedded-library.generated.ts, server/java/metadata/src/main/java/com/metaobjects/library/EmbeddedLibrary.java and server/csharp/MetaObjects/Library/EmbeddedLibrary.cs
── ✓ embedded-library drift (0s)

── ⊘ --quick: SKIPPING the other-language ports (csharp/java/python/kotlin),
        the full Java reactor, the docker integration suite and the cube live
        check. Run the full `scripts/ci-local.sh` (no flag) before opening/merging
        a PR or tagging.

══════════════════════ SUMMARY ══════════════════════
  ✓ leak-scan (security)
  ✓ pom-version parity
  ✓ bun-version parity
  ✓ uv.lock version parity
  ✓ publish-intent parity
  ✓ publish-set parity
  ✓ no committed pre-release version
  ✓ script-name hook collisions  (1s)
  ✓ ci lane selection
  ✓ extract field kinds
  ✓ no-magic gate wired (5 ports)
  ✓ test-file references resolve
  ✓ metamodel-version bump
  ✓ positioning claims
  ✓ hosted assess prompt builds
  ✓ migration guides vs registry
  ✓ dependencies installed
  ✓ peer-range bounds
  ✓ owned template copies current
  ✓ reference templates lint
  ✓ shipped doc examples load  (1s)
  ✓ no retired $apiPrefix
  ✓ site payload is true  (18s)
  ✓ site reference is fresh  (1s)
  ✓ release tag gate  (11s)
  ✓ scripts/ typecheck  (3s)
  ✓ requirements ledger verifies  (2s)
  ✓ requirements cover vocabulary
  ✓ metamodel scaffolder  (1s)
  ✓ requirement harness
  ✓ fixture-lint
  ✓ ts build + typecheck  (14s)
  ✓ conformance: typescript  (2m29s)
  ✓ ts unit suites  (18s)
  ✓ completeness-gate (mutation)  (5m50s)
  ✓ doc-template drift
  ✓ embedded-library drift
  ⊘ csharp/java/python/kotlin conformance (--quick)
  ⊘ java-reactor (--quick)
  ⊘ integration-tests (--quick)
  ⊘ cube-model live check (--quick)
── slowest steps ──
     5m50s  completeness-gate (mutation)
     2m29s  conformance: typescript
       18s  site payload is true
       18s  ts unit suites
       14s  ts build + typecheck
       11s  release tag gate
        3s  scripts/ typecheck
        2s  requirements ledger verifies
        1s  metamodel scaffolder
        1s  script-name hook collisions
        1s  shipped doc examples load
        1s  site reference is fresh
  total wall time: 9m29s
══════════════════════════════════════════════════════
LOCAL CI PASSED (with 4 skipped — see ⊘ above).
exit=0
Evidence: TS contract-only output (Zod + types, no drizzle)
// @generated by @metaobjectsdev/codegen-ts — hand edits are kept by a three-way merge on regeneration; meta verify --codegen checks only the generated parts.
// Source metadata: Author (Author)
// Extend in your own module (e.g. Author.extra.ts) — nothing imports it for you.
import { z } from "zod";

export interface Author {
  id?: number | undefined;
  name: string;
}
export const AuthorInsertSchema = z.object({
  id: z.number().int(),
  name: z.string().min(1).max(200),
});

export const AuthorUpdateSchema = z.object({
  id: z.number().int().optional(),
  name: z.string().min(1).max(200).optional(),
});

/** Typed create shape for Author: the insert schema's INPUT (pre-transform) type. A
 * renamed/dropped/misspelt field is a compile error at every `createAuthor` call site;
 * the schema still validates at runtime. */
export type AuthorCreate = z.input<typeof AuthorInsertSchema>;

/** Typed patch shape for Author: every settable field, optional (FR-035 PATCH). A
 * renamed/dropped field is a compile error at every `updateAuthor` call site. */
export type AuthorPatch = z.input<typeof AuthorUpdateSchema>;
export type AuthorFilter = {
  limit?: number;
  offset?: number;
  sort?: string;
  or?: AuthorFilter[];
  and?: AuthorFilter[];
};
Evidence: C# sourceless POCO output
// <auto-generated/>
// Generated by MetaObjects entity-generator (owned value object). Do not edit by hand.
#nullable enable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;

namespace Shop;

public class AuthorSummary
{
    [JsonPropertyName("id")]
    public long Id { get; set; }
    [JsonPropertyName("name")]
    [Required(AllowEmptyStrings = true)]
    [MaxLength(200)]
    [MinLength(1)]
    public string Name { get; set; } = default!;
}
// hand edit
Evidence: Python Pydantic entity output
# @generated by metaobjects — DO NOT EDIT.
# Source metadata: AuthorSummary (shop::AuthorSummary)
# Extend in your own module (e.g. AuthorSummary_extra.py) — nothing imports it for you.

from __future__ import annotations

from pydantic import BaseModel, Field


class AuthorSummary(BaseModel):
    id: int | None = None
    name: str = Field(max_length=200)


class AuthorSummaryCreate(BaseModel):
    """GENERATED — CREATE input: auto-gen PK / @mutability readOnly omitted (writeOnce is settable here, once); @default/@autoSet optional; present values validated (FR-036)."""

    id: int
    name: str = Field(min_length=1, max_length=200)


class AuthorSummaryPatch(BaseModel):
    """GENERATED — PATCH input: all fields optional (PK, @mutability readOnly and writeOnce excluded); present values validated (FR-036)."""

    name: str | None = Field(default=None, min_length=1, max_length=200)
# hand edit
  • Outcome: ⚠️ 1 info across 1 run (1h12m29s)

Pipeline

Updates from git push no-mistakes

✅ **Intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

⚠️ **Review** - 1 info
  • ℹ️ docs/ports/typescript.md:880 - Inline fix: docs/ports/typescript.md Known gaps paragraph had a garbled sentence break ("manages its schema itself. and hand edits survive..."); changed to "Hand edits survive..." as a new sentence.
⚠️ **Test** - 1 info
  • ℹ️ docs/ports/typescript.md - typescript.md 'Keep your ORM' snippet calls entityFile({ target: &#34;contract&#34; }) without an import. In 1.1.x entityFile exists only as an ejected generator (meta eject entity, then import { entityFile } from &#34;./codegen/generators/entity&#34;). A reader pasting the snippet gets entityFile is not a function until they eject. Consider adding the eject step or the import line.
  • Live validation: ✅ go - 5 of 6 scenarios driven live against the product
Scenario Result Live Evidence
TS adopter sets a target to runtime: false, ejects entity, runs meta gen: output is Zod + types with no drizzle-orm or runtime-ts import ✅ pass live ts-proj/src/contract/Author.ts; grep for drizzle|runtime-ts found nothing
C# adopter declares an entity with no source.rdb, runs dotnet meta gen: a POCO with DataAnnotations and no [Table]/DbSet is written ✅ pass live cs-proj/src/Generated/AuthorSummary.g.cs; SourcelessEntityGatesTests 9/9
C# hand-edit then regen: file refused by name, no three-way merge (matches csharp.md) ✅ pass live dotnet meta gen output: 'refused: AuthorSummary.g.cs ... 0 file(s) written'
Python metaobjects gen entity generator writes Pydantic models with no ORM; hand-edited file refused on regen ✅ pass live py-proj/generated/AuthorSummary.py; 'Refused to overwrite AuthorSummary.py'
Java/Kotlin baselines (Java 21, Kotlin 2.0, JVM 21) and handEdits keep/overwrite policy match the build config ⏸️ untested no Prior payload did not establish a live result: Maven generate on a Java/Kotlin project was not run, and mvn metaobjects:eject was not run. Claims were checked only by reading java/pom.xml, codegen-k…
Known-gaps links on each port page and the llms/CHANGELOG/feature-doc edits resolve and the repo doc gates stay green ✅ pass live All four KNOWN_GAPS.md targets exist; ci-local --quick passed (shipped doc examples load, doc-template drift, site payload)
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains
  • scripts/ci-local.sh --quick (full: ts build/typecheck, ts unit, conformance typescript, completeness-gate mutation, doc-template drift, embedded-library drift, site payload, shipped doc examples load, requirements ledger, hygiene) - passed; C#/Java/Python/Kotlin lanes skipped by --quick
  • Baseline scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains (already green)
  • Live: meta eject entity + meta gen in a throwaway project using the doc's runtime: false target snippet
  • Live: C# CLI init + gen metaobjects --out ... --namespace Shop with the doc's sourceless AuthorSummary entity, then hand-edit + regen
  • Live: Python metaobjects gen (entity generator), then hand-edit + regen
  • dotnet test MetaObjects.Codegen.Tests --filter SourcelessEntityGatesTests (9 passed)
  • Checked doc facts against source (code reading only, not live): java/pom.xml &lt;release&gt;21, codegen-kotlin jvmTarget 21 / Kotlin 2.0.21, C# net8.0, GeneratorParam handEdits keep/overwrite, MetaDataEjectMojo names property, four KNOWN_GAPS.md link targets exist
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

@dmealing
dmealing merged commit aa8bfb8 into main Oct 28, 2026
1 check passed
@dmealing
dmealing deleted the fm/mo-port-docs-fit-fixes branch October 28, 2026 04:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant