Skip to content

fix: close adopter defects for 1.2.0 across Python routers, filter query strings, and docs-site assets - #507

Merged
dmealing merged 9 commits into
mainfrom
fm/mo-release-fixes
Oct 29, 2026
Merged

dmealing merged 9 commits into
mainfrom
fm/mo-release-fixes

Conversation

@dmealing

@dmealing dmealing commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

Fixes #485, Fixes #486, Fixes #487, Fixes #489, Fixes #491, Fixes #492, Fixes #493, Fixes #494

What Changed

  • Python codegen and CLI: generated routers now pass mypy --strict. The repository Protocol uses a builtins.list alias so its list method no longer shadows the builtin, delete handlers return a 204 Response, and M:N traversal handlers bind rows to a typed local. A new test runs mypy --strict over routers generated from the fitness corpus. metaobjects agent-docs help now says the command only points to npx meta agent-docs --server python and exits 1; its three ignored flags are hidden but still accepted.
  • Runtime web and docs-site: buildFilterQs({ withCount: true }) now sends withCount=1, which the server reads. false/0 send nothing. docsSiteFile({ assetBase }) and generateSite({ assetBase }) let the page chrome load daisyUI, Tailwind, Mermaid and svg-pan-zoom from a base the caller chooses; the default jsDelivr URL and default output are unchanged. The link checker skips root-relative hrefs.
  • Docs and metamodel text: verify tables give each port's real bare command and the C# binary (dotnet meta verify). The README capability matrix splits DB-drift verify from codegen-drift verify. Entity docs say C# entities are classes and Python entities are Pydantic models. The @formExclude description now states that generated create, PATCH and PUT routes ignore the field, across the spec, port registries, expected-registry.json, and the regenerated fixtures and reference site.

Testing: which lanes ran where

Run locally before the gate (each green unless noted):

  • Python (server/python, uv run --extra integration): the full suite apart from tests/integration, plus the generated-lane integration tests (109 passed), the new mypy --strict router test, and the registry conformance test. Two tests fail the same way on an untouched main (test_verify_codegen_bare_defaults_to_codegen, test_a_model_with_no_requirement_and_no_generators_selected_still_exits_0_and_says_nothing_new); they are not touched here.
  • TypeScript: runtime-web filter-qs tests, docs-site tests (59, golden unchanged), the cli gen-docs-site test, and the metadata registry conformance and completeness tests.
  • C# and Java: the registry-manifest conformance tests only (for the @formExclude description). No other C# or Java suite was run; this PR changes no C# or Java code.
  • Positioning-claims check passes. A full scripts/ci-local.sh --quick was started but cut off by a local timeout at its mutation step.

Run by the no-mistakes gate: scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains (build and typecheck, TypeScript conformance, TypeScript unit suites, completeness mutation gate), which passed. The CI step was skipped (local CI mode), so no hosted checks ran on this PR.

Live validation was inconclusive. The gate's analyzer never drove the product live (its evidence payload was rejected three times), and the test gate was approved on that basis by the maintainer. Nothing here claims a live pass.

Gate runs: 3. Run 1 failed in the test step and run 2 in the rebase step because agent and build processes were killed on an overloaded host; neither failure came from the code. Run 3 is the one that passed.

Validation

Risk Assessment

✅ Low: Changes are bounded: Python router annotation and 204 fixes, a buildFilterQs wire fix, an optional docs-site assetBase that leaves default output byte-identical, and doc corrections. The per-port verify claims match the C#, Java, Python and TypeScript sources.

Testing

The prior submission was a placeholder with no tests, scenarios, or evidence. Nothing was driven live, so no scenario is marked pass or fail. Live validation is required before this change can be judged.

  • Live validation: ⚠️ inconclusive - 0 of 1 scenarios driven live against the product
Scenario Result Live Evidence
Change behavior as described by the user intent, driven against the running product ⏸️ untested no The rejected payload recorded no scenarios and no live run. This correction turn may not use tools or start the product, so no live result can be established here.
  • Outcome: ⚠️ 1 warning across 1 run (1h46m30s)

Pipeline

Updates from git push no-mistakes

✅ **Intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 1 issue found → auto-fixed (2) ✅
  • ⚠️ examples/showcase/generated/python/subscriber_router.py:261 - Router generator changed (builtin _list alias import, -> Response delete handler returning a 204 Response, Response import) but the committed generated Python showcase was not regenerated. examples/showcase/generated/python/subscriber_router.py still has from typing import ... without from builtins import list as _list, filters: list[FilterPredicate] / -> list[Any] at lines 119-121, ) -> None: on delete_subscriber at line 261, and from fastapi.responses import JSONResponse at line 20. scripts/ci-local.sh gate_showcase_all_ports runs bun scripts/regen-showcase.ts --check --all-ports, which regenerates the Python port with the current generator and diffs it against the committed file, so that gate fails. The committed example also still demonstrates the shape that fails mypy --strict (Python routers: the repository Protocol's list method shadows the builtin list under mypy --strict #486/Python routers: fix handler return annotations so mypy --strict passes #487). Remedy: run bun scripts/regen-showcase.ts --all-ports (python lane) and commit the updated subscriber_router.py.

🔧 Fix applied.
1 warning still open:

  • ⚠️ docs/features/migrations-and-drift.md:377 - The new per-port verify docs say a check with no configuration is "skipped with a one-line note, never failed" and list bare dotnet meta verify as running the template check. For C# that is false. server/csharp/MetaObjects.Cli/Program.cs:455-466 makes a bare verify run the templates gate, defaults the root to prompts/ or templates/, and returns exit 2 ("templates directory not found") when neither exists. server/csharp/MetaObjects.Cli.Tests/CliSurfaceTests.cs:96-102 (A_bare_verify_with_neither_prompts_nor_templates_fails) pins that behavior. A C# adopter with no prompts directory who follows the new tables runs a bare dotnet meta verify and gets a hard failure the docs say cannot happen. This is the same class of wrong-command-docs defect Docs: per-port verify tables give a Python command that does not run and the wrong C# binary #492 targets. Sites to fix: docs/features/migrations-and-drift.md:377 ("never failed") and its C# row at :385 (Templates column omits the default-root requirement); docs/features/templates-and-payloads.md:718 ("skips this check with a note") and its C# row at :726. The C# row and the blanket sentence should say a bare C# run needs prompts/ or templates/ (or --templates <root>) to exist, else it exits 2. docs/features/requirements.md:352 ("runs the requirement gate with the other default gates") should carry the same caveat.

🔧 Fix applied.
✅ Re-checked - no issues remain.

⚠️ **Test** - 1 warning
  • ⚠️ live validation verdict: inconclusive (0 of 1 scenarios were driven live against the product); untested: Change behavior as described by the user intent, driven against the running product
  • Live validation: ⚠️ inconclusive - 0 of 1 scenarios driven live against the product
Scenario Result Live Evidence
Change behavior as described by the user intent, driven against the running product ⏸️ untested no The rejected payload recorded no scenarios and no live run. This correction turn may not use tools or start the product, so no live result can be established here.
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains
  • No tests were executed. The rejected payload recorded none, and this correction turn ran no tools.
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…setBase, and verify/entity doc corrections

Python generated routers pass mypy --strict (Protocol list alias, Response-typed
delete, typed M:N rows); buildFilterQs sends withCount=1; metaobjects agent-docs
help and flags match its redirect; docsSiteFile takes assetBase; per-port verify
tables, the README capability matrix and the C#/Python entity samples are corrected.
# Conflicts:
#	CHANGELOG.md
#	README.md
#	server/python/pyproject.toml
#	server/python/uv.lock
…te routes ignore the field

Since #484 the generated create, PATCH and PUT routes drop a value sent for a
@formExclude field and reads are unchanged; the description said only that the field
is omitted from generated forms. Same sentence in the spec, the TypeScript, Python and
C# registry sources, expected-registry.json, the metamodel-docs fixture and the
reference site (regenerated).
@dmealing
dmealing merged commit 7b67aba into main Oct 29, 2026
1 check passed
@dmealing
dmealing deleted the fm/mo-release-fixes branch October 29, 2026 02:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment