Skip to content

fix: close 1.1.0 release defects found in application re-test - #442

Merged
dmealing merged 2 commits into
mainfrom
fm/mo-1-1-0-rc5-fixes
Oct 17, 2026
Merged

dmealing merged 2 commits into
mainfrom
fm/mo-1-1-0-rc5-fixes

Conversation

@dmealing

Copy link
Copy Markdown
Member

What Changed

  • Codegen fixes: Kotlin spring-config now declares requires from its configured args, so validatorEnabled=false no longer demands the validator; the Maven plugin checks requirements per configured instance. Missing packageName errors now name the generator. Python entities emit Field(default_factory=list) for list relations, and Python api-docs place each page under its own entity's package instead of the first loaded file's. meta gen --baseline=fresh overwrites an unrecorded path instead of merging against a stale git-ignored snapshot.
  • Migrate fix: SQLite introspection strips backtick-quoted identifiers and recognizes all four SQLite identifier quotings in CHECK constraint names, removing the false drop/add pair in verify --db and the migrate re-diff.
  • Docs and release tooling: CHANGELOG folds [Unreleased] into 1.1.0, lists physical naming under Breaking, and corrects the lede (naming changes generated output for unchanged models). Shipped skill references and .metaobjects/AGENTS.md/CLAUDE.md templates (with conformance fixtures) point to the 1.0-to-1.1 migration guides and cover naming for Java and Kotlin. scripts/prerelease.mjs prints a dry-run banner instead of the publish success banner and labels the Java dry run correctly.
Validation

Risk Assessment

✅ Low: Each rc.5 defect has a bounded root-cause fix with a behavioral regression test, and I found no wrong-result path in the changed code.

Testing

The baseline scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains had already passed. I drove each runtime fix against the real tooling: Python api-docs, Python entity codegen, the prerelease dry run, SQLite CHECK introspection, meta gen --baseline=fresh, and the Kotlin and Java plugin requires tests. I then ran the full scripts/ci-local.sh (TS, Java, Kotlin, Python, C#, integration lanes), which exited 0. N-A (CHANGELOG) and N-B (skill/guide pointers) are docs-only and were not driven live.

  • Live validation: ✅ go - 6 of 7 scenarios driven live against the product
Scenario Result Live Evidence
Python api-docs writes each entity's page under its own package, with matching back-links (N-D) ✅ pass live nd-live-apidocs.log: pages at api/alpha/lib/Widget.md and api/beta/app/Order.md; Order back-link is ../../../beta/app/Order.md; plus tests/test_api_docs_packages.py
Python generated entity list fields use default_factory=list, not a shared mutable default (F12) ✅ pass live f12-live-check.log: default_factory is list, instances do not share the list
SQLite introspection keeps a backtick-quoted CHECK constraint name, so verify --db reports no false drop/add (R1); a real CHECK change still reports drift ✅ pass live r1-verify-backtick.log, r1-verify-bk.log, r1-verify-br.log and r1-verify-dq.log show empty changes; r1-verify-drift.log shows the real drop-check/add-check pair
meta gen --baseline=fresh overwrites instead of merging when a stale git-ignored snapshot exists (R2) ✅ pass live r2-A-gen-fresh.log status overwrite; r2-B-gen-fresh.log shows the merged status without the fresh baseline; plus baseline-fresh-stale-snapshot.test.ts
Prerelease dry run prints the success banner only after a verified dry run and shows the correct label (N-E) ✅ pass live ne-prerelease-dryrun-npm.log: 'dry run of 1.1.0-rc.99 passed; nothing was published' after checks; ne-prerelease-dryrun.log: missing credentials fail with no banner
Kotlin spring-config requires follow the configured args, and a missing packageName error names the generator (N-C) ✅ pass live KotlinPackageNameRequiredTest (3 tests) run directly and the Java/Kotlin GeneratorRequiresCompileTest (3 tests) in the full ci-local run; the plugin tests cover both validatorEnabled settings
CHANGELOG folds Unreleased into 1.1.0 with naming under Breaking, and skills/AGENTS.md point to the 1.0-to-1.1 guides (N-A, N-B) ⏸️ untested no No runtime product surface: prose and static agent-context files. The only automated check is the expected-fixture comparison in ci-local, which is not a live scenario.
Evidence: Python api-docs per-package pages
PAGE api/AGENT-API.md
PAGE api/README.md
PAGE api/alpha/lib/Widget.md
PAGE api/beta/app/Order.md
--- beta Order back-link lines:
**Model / metadata:** [Order](../../../beta/app/Order.md)
Evidence: F12 default_factory live check
tags default_factory: <class 'list'>
tags default is list: True
instances share tags list: False
Evidence: R1 SQLite verify with backtick CHECK name
meta: meta verify — schema in sync with file:drizzle.db.
meta: meta verify — not run: templates (--templates), codegen (--codegen), deps (--deps), replay (--replay)
verify[6]{gate,ran,ok}:
  templates,false,true
  schema,true,true
  codegen,false,true
  deps,false,true
  requirements,true,true
  replay,false,true
exitCode: 0
summary: "2 gate(s) ran, all clean"
help[1]: no drift and nothing advisory to answer — nothing to do
antiPatterns:
  status: ran
  total: 0
  rows: []
requirements:
  status: ran
  total: 0
  rows: []
overlays:
  status: ran
  total: 0
  rows: []
names:
  status: ran
  total: 0
  rows: []
deprecations:
  status: ran
  total: 0
  rows: []
fields:
  status: ran
  total: 0
  rows: []
schemaDrift:
  changes: []
  findings: []
notRepresented[2]: "per-gate drift detail for every gate but schema (which template variable drifted, which generated file differs, which migration failed to replay) — printed as text on stderr; this payload carries each gate's pass/fail verdict, and the schema gate's differences in schemaDrift",the loader's own warnings and the agent-context/manifest advisories — printed as text on stderr
Evidence: R1 real drift still detected
meta: meta verify — schema drift vs file:drift.db (2 change(s)):
meta:   - check items check items_status_chk (`status` IN ('open'))
meta:   + check items check items_status_chk ("status" IN ('open', 'closed'))
meta: meta verify — not run: templates (--templates), codegen (--codegen), deps (--deps), replay (--replay)
verify[6]{gate,ran,ok}:
  templates,false,true
  schema,true,false
  codegen,false,true
  deps,false,true
  requirements,true,true
  replay,false,true
exitCode: 1
summary: 1 of 2 gate(s) failed (schema)
help[1]: "the schema gate's differences are in schemaDrift — changes[] (metadata vs database, one row per change) and findings[] (migration ledger and committed snapshot)"
antiPatterns:
  status: ran
  total: 0
  rows: []
requirements:
  status: ran
  total: 0
  rows: []
overlays:
  status: ran
  total: 0
  rows: []
names:
  status: ran
  total: 0
  rows: []
deprecations:
  status: ran
  total: 0
  rows: []
fields:
  status: ran
  total: 0
  rows: []
schemaDrift:
  changes[2]{kind,object,detail}:
    drop-check,check,items check items_status_chk (`status` IN ('open'))
    add-check,check,"items check items_status_chk (\"status\" IN ('open', 'closed'))"
  findings: []
notRepresented[2]: "per-gate drift detail for every gate but schema (which template variable drifted, which generated file differs, which migration failed to replay) — printed as text on stderr; this payload carries each gate's pass/fail verdict, and the schema gate's differences in schemaDrift",the loader's own warnings and the agent-context/manifest advisories — printed as text on stderr
Evidence: R2 baseline=fresh overwrite
gen[1]{file,status}:
  src/generated/Widget.ts,overwrite
summary: 1 written
help[1]: typecheck the generated code with `npx tsc`
antiPatterns:
  status: ran
  total: 0
  rows: []
Evidence: N-E prerelease dry run

── pre-release 1.1.0-rc.99  (DRY RUN) → 127.0.0.1:4873 ──

  released: 1.0.13   committed: 1.1.0   base: 1.1.0 (from CHANGELOG.md)   iteration: 99
  npm 1.1.0-rc.99  ·  pypi 1.1.0rc99  ·  nuget 1.1.0-rc.99  ·  maven 8.1.0-rc.99
  ports: npm

�[32m✓�[0m publish target verified: 127.0.0.1:4873 (configured registry; not a public one)
�[32m✓�[0m version-bearing files clean
�[32m✓�[0m npm lockstep set: 14 packages → 1.1.0-rc.99
�[32m✓�[0m relocked + clean rebuild
�[32m✓�[0m packed deps pinned to 1.1.0-rc.99
�[32m✓�[0m bun publish target verified by dry-run: http://127.0.0.1:4873/api/packages/disposable/npm/
�[32m✓�[0m npm: dry run, nothing published

�[32m�[1m✔ dry run of 1.1.0-rc.99 passed; nothing was published.�[0m
Evidence: Full regression log
metaobjects local CI  (mode: full — all ports + reactor + docker)

── ▶ leak-scan (security) ──────────────────────────────────────────────
leak-scan: clean

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

── ▶ bun-version parity ──────────────────────────────────────────────
check-bun-version: bun 1.3.14 matches the workflow pin.

── ▶ uv.lock version parity ──────────────────────────────────────────────
check-uv-lock-version: uv.lock agrees with pyproject.toml (1.1.0)

── ▶ publish-intent parity ──────────────────────────────────────────────
publish-intent parity: OK (lockstep 1.1.0; 2 declared source-only)

── ▶ 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.0; 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

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

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

── ▶ 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

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

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

── ▶ test-file references resolve ──────────────────────────────────────────────
test-file references: 32 named, all resolve

── ▶ metamodel-version bump ──────────────────────────────────────────────

  ⚠ metamodel-version: 19 prose field(s) changed since v1.0.13:
    - field.base @column: description
    - field.boolean @column: description
    - field.currency @column: description
    - field.date @column: description
    - field.decimal @column: description
    - field.double @column: description
    - field.enum @column: description
    - field.float @column: description
    - field.inet @column: description
    - field.int @column: description
    - field.long @column: description
    - field.map @column: description
    … and 7 more

    Did the RULE change, or only its wording? A rule can change with no
    machine-readable footprint — #210 retired assembly origins from object.value
    and its only manifest edit was a `rules` string. If the rule changed, this is
    a metamodel MAJOR: run
      node scripts/check-metamodel-version.mjs --set <version>

  metamodel-version: additive change since v1.0.13; declared 1.1 (1.0 → 1.1) — 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 cha

... [339625039 bytes truncated] ...

────────────────────────────
==> cube-model live check (Cube + Postgres)
$ bun test ./cube-live/cube-model.live.ts ./cube-live/cube-model-mysql.live.ts
bun test v1.3.14 (0d9b296a)

cube-live/cube-model.live.ts:
cube live check timings:
  stack up (pull if needed, Postgres + schema + seed, Cube /meta): 6459 ms
  ProgramMinutes: 3 row(s) compared, served from dev_pre_aggregations.week__program_minutes, load 276 ms
  FitnessTotals: 1 row(s) compared, served from dev_pre_aggregations.week__fitness_totals, load 64 ms
  ProgramsByMonth: 5 row(s) compared, served from dev_pre_aggregations.program__programs_by_month, load 69 ms
  ProgramsByWeek: 5 row(s) compared, served from dev_pre_aggregations.program__programs_by_week, load 65 ms
  RecentPrograms: 1 row(s) compared, served from the source table, load 54 ms
  AssetActivity: 2 row(s) compared, served from dev_pre_aggregations.asset__asset_activity, load 56 ms
  ProgramRoster: 11 row(s) compared, served from the source table, load 42 ms
  ProgramLongWeeks: 11 row(s) compared, served from the source table, load 34 ms
  ProgramFlags: 3 row(s) compared, served from dev_pre_aggregations.week__program_flags, load 66 ms
  ProgramFlagRoster: 11 row(s) compared, served from the source table, load 32 ms
  FitnessTotalsFilled: 1 row(s) compared, served from dev_pre_aggregations.week__fitness_totals_filled, load 50 ms
  MeasurementStats: 1 row(s) compared, served from dev_pre_aggregations.measurement__measurement_stats, load 51 ms
  MeasurementStatsFilled: 1 row(s) compared, served from dev_pre_aggregations.measurement__measurement_stats_filled, load 45 ms
  AssetDays: 1 row(s) compared, served from dev_pre_aggregations.asset__asset_days, load 46 ms
  AllTypesBreakdown: 2 row(s) compared, served from the source table, load 30 ms
  ProgramsOverTime: 7 row(s) compared, served from the source table, load 26 ms
  LiveIntroPrograms: 2 row(s) compared, served from dev_pre_aggregations.program__live_intro_programs, load 55 ms
  ProgramsEmptyScope: 1 row(s) compared, served from dev_pre_aggregations.program__programs_empty_scope, load 51 ms
  WeekShapes: 3 row(s) compared, served from dev_pre_aggregations.week__week_shapes, load 48 ms
  SessionsByProgram: 3 row(s) compared, served from dev_pre_aggregations.session__sessions_by_program, load 53 ms
  ProgramSessions: 11 row(s) compared, served from the source table, load 37 ms
  NodesByParent: 3 row(s) compared, served from dev_pre_aggregations.node__nodes_by_parent, load 49 ms
  AuthsByKind: 3 row(s) compared, served from dev_pre_aggregations.auth__auths_by_kind, load 49 ms
  corpus compile pass: 36/36 case(s) loaded in 10962 ms, 14 declared title/description value(s) handed back verbatim (dimension-attribute-types, dimension-int-enum, dimension-over-key, dimension-time, dimension-time-mysql, dimension-time-two-grains, dimension-uri-inet, dimension-via, dimension-via-join-target, entity-cube, entity-tph-subtype, escaping, free-text-jinja, join-alias-cubes, join-composite, join-many-to-one, join-one-to-one, join-self-reference, measure-boolean, measure-boolean-mysql, measure-conditions, measure-count, measure-count-distinct, measure-count-distinct-tuple, measure-count-distinct-tuple-condition, measure-default, measure-mysql, measure-ratio, measure-sum-avg-min-max, relative-date, report-relative-no-rollup, report-rollup, report-sourceless, report-spine, report-spine-multi-hop, segment)
  escaping /v1/sql braces: ok, ".\"title\" = 'a{b}c'"
  escaping /v1/sql doubleBraces: ok, ".\"title\" = '{{x}}'"
  escaping /v1/sql jinja: ok, ".\"title\" = '{{y}} {% z %} {# c #}'"
  escaping /v1/sql quote: ok, ".\"title\" = 'it''s'"
  escaping /v1/sql backslash: ok, ".\"title\" = 'a\\b'"
  escaping /v1/sql trailingBackslash: ok, ".\"title\" = 'ends\\'"
  escaping /v1/sql backslashBrace: ok, ".\"title\" = 'a\\{b}'"
  escaping /v1/sql lineBreak: ok, ".\"title\" = 'two\nlines'"
  measure-default /v1/sql: revenuePerSale ok, revenuePerSaleOrZero ok

cube-live/cube-model-mysql.live.ts:
cube mysql live check timings:
  stack up (MySQL + schema + seed, Cube /meta): 15232 ms
  ProgramMinutes: 3 row(s) compared, served from dev_pre_aggregations.week__program_minutes, load 255 ms
  FitnessTotals: 1 row(s) compared, served from dev_pre_aggregations.week__fitness_totals, load 182 ms
  ProgramsByMonth: 5 row(s) compared, served from dev_pre_aggregations.program__programs_by_month, load 184 ms
  ProgramsByWeek: 5 row(s) compared, served from dev_pre_aggregations.program__programs_by_week, load 169 ms
  RecentPrograms: 1 row(s) compared, served from the source table, load 158 ms
  AssetActivity: 2 row(s) compared, served from dev_pre_aggregations.asset__asset_activity, load 177 ms
  ProgramRoster: 11 row(s) compared, served from the source table, load 139 ms
  ProgramLongWeeks: 11 row(s) compared, served from the source table, load 150 ms
  ProgramFlags: 3 row(s) compared, served from dev_pre_aggregations.week__program_flags, load 166 ms
  ProgramFlagRoster: 11 row(s) compared, served from the source table, load 176 ms
  FitnessTotalsFilled: 1 row(s) compared, served from dev_pre_aggregations.week__fitness_totals_filled, load 159 ms
  MeasurementStats: 1 row(s) compared, served from dev_pre_aggregations.measurement__measurement_stats, load 170 ms
  MeasurementStatsFilled: 1 row(s) compared, served from dev_pre_aggregations.measurement__measurement_stats_filled, load 157 ms
  AssetDays: 1 row(s) compared, served from dev_pre_aggregations.asset__asset_days, load 169 ms
  AllTypesBreakdown: 2 row(s) compared, served from the source table, load 134 ms
  ProgramsOverTime: 7 row(s) compared, served from the source table, load 132 ms
  LiveIntroPrograms: 2 row(s) compared, served from dev_pre_aggregations.program__live_intro_programs, load 145 ms
  ProgramsEmptyScope: 1 row(s) compared, served from dev_pre_aggregations.program__programs_empty_scope, load 157 ms
  WeekShapes: 3 row(s) compared, served from dev_pre_aggregations.week__week_shapes, load 165 ms
  SessionsByProgram: 3 row(s) compared, served from dev_pre_aggregations.session__sessions_by_program, load 187 ms
  ProgramSessions: 11 row(s) compared, served from the source table, load 140 ms
  NodesByParent: 3 row(s) compared, served from dev_pre_aggregations.node__nodes_by_parent, load 200 ms
  AuthsByKind: 3 row(s) compared, served from dev_pre_aggregations.auth__auths_by_kind, load 209 ms

 54 pass
 0 fail
 413 expect() calls
Ran 54 tests across 2 files. [41.02s]
OK — all selected runners passed.

══════════════════════ 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
  ✓ 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
  ✓ no retired $apiPrefix
  ✓ site payload is true
  ✓ site reference is fresh
  ✓ release tag gate
  ✓ scripts/ typecheck
  ✓ requirements ledger verifies
  ✓ requirements cover vocabulary
  ✓ metamodel scaffolder
  ✓ requirement harness
  ✓ fixture-lint
  ✓ ts build + typecheck
  ✓ conformance: typescript
  ✓ ts unit suites
  ✓ completeness-gate (mutation)
  ✓ doc-template drift
  ✓ embedded-library drift
  ✓ conformance: csharp
  ✓ conformance: java
  ✓ conformance: python
  ✓ conformance: kotlin
  ✓ java-reactor (install)
  ✓ integration-tests (5-port + docker)
  ✓ cube-model live check (Cube + Postgres)
══════════════════════════════════════════════════════
LOCAL CI PASSED
EXIT=0

Pipeline

Updates from git push no-mistakes

✅ **Intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 6 of 7 scenarios driven live against the product
Scenario Result Live Evidence
Python api-docs writes each entity's page under its own package, with matching back-links (N-D) ✅ pass live nd-live-apidocs.log: pages at api/alpha/lib/Widget.md and api/beta/app/Order.md; Order back-link is ../../../beta/app/Order.md; plus tests/test_api_docs_packages.py
Python generated entity list fields use default_factory=list, not a shared mutable default (F12) ✅ pass live f12-live-check.log: default_factory is list, instances do not share the list
SQLite introspection keeps a backtick-quoted CHECK constraint name, so verify --db reports no false drop/add (R1); a real CHECK change still reports drift ✅ pass live r1-verify-backtick.log, r1-verify-bk.log, r1-verify-br.log and r1-verify-dq.log show empty changes; r1-verify-drift.log shows the real drop-check/add-check pair
meta gen --baseline=fresh overwrites instead of merging when a stale git-ignored snapshot exists (R2) ✅ pass live r2-A-gen-fresh.log status overwrite; r2-B-gen-fresh.log shows the merged status without the fresh baseline; plus baseline-fresh-stale-snapshot.test.ts
Prerelease dry run prints the success banner only after a verified dry run and shows the correct label (N-E) ✅ pass live ne-prerelease-dryrun-npm.log: 'dry run of 1.1.0-rc.99 passed; nothing was published' after checks; ne-prerelease-dryrun.log: missing credentials fail with no banner
Kotlin spring-config requires follow the configured args, and a missing packageName error names the generator (N-C) ✅ pass live KotlinPackageNameRequiredTest (3 tests) run directly and the Java/Kotlin GeneratorRequiresCompileTest (3 tests) in the full ci-local run; the plugin tests cover both validatorEnabled settings
CHANGELOG folds Unreleased into 1.1.0 with naming under Breaking, and skills/AGENTS.md point to the 1.0-to-1.1 guides (N-A, N-B) ⏸️ untested no No runtime product surface: prose and static agent-context files. The only automated check is the expected-fixture comparison in ci-local, which is not a live scenario.
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains
  • scripts/ci-local.sh --only ts-fast --only ts-unit --strict-toolchains (baseline, passed)
  • scripts/ci-local.sh full run, exit 0
  • mvn -pl codegen-kotlin test -Dtest=KotlinPackageNameRequiredTest (3 tests, 0 failures)
  • Java mojo GeneratorRequiresCompileTest and Kotlin integration lane in the full run (3 tests, 0 failures)
  • Python pytest including tests/test_api_docs_packages.py and tests/codegen/test_m2m_codegen.py (22 passed)
  • live Python api-docs run with two packages: pages under alpha/lib and beta/app, back-link points to the entity's own package
  • live Python entity check: tags uses default_factory=list and instances do not share the list
  • live meta verify against SQLite with backtick, bracket and double-quoted CHECK names: no false drop/add pair; a real CHECK change still reports drift
  • live meta gen --baseline=fresh with a stale git-ignored snapshot: status overwrite, not merged
  • prerelease dry run against a disposable local registry: banner only after the verified dry run; missing credentials print a failure and no banner
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…upgrade pointers, SQLite CHECK names, baseline=fresh)

- CHANGELOG: fold [Unreleased] into [1.1.0], correct the lede, add the naming default to Breaking
- Kotlin spring-config requires the validator only when validatorEnabled; a missing packageName names the generator
- Python api-docs files pages under each object's own package; M:N navs use Field(default_factory=list)
- agent-context: 1.0 to 1.1 upgrade pointer, naming in java.md and kotlin.md, guide notes
- prerelease dry run no longer claims a publish
- SQLite/D1 introspection reads backtick and bracket quoted CHECK names and compares backtick identifiers
- meta gen --baseline=fresh ignores a stale snapshot for a path the manifest has no record of
@dmealing
dmealing merged commit df08643 into main Oct 17, 2026
1 check passed
@dmealing
dmealing deleted the fm/mo-1-1-0-rc5-fixes branch October 17, 2026 07:46
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