Skip to content

Commit 3888e29

Browse files
committed
no-mistakes(document): docs: correct stale view.* registration prose across features, ADR
1 parent 4301ed7 commit 3888e29

5 files changed

Lines changed: 38 additions & 16 deletions

File tree

‎docs/features/image-upload.md‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ image to a consumer-supplied adapter and stores only the key the adapter
77
returns. No image bytes ever cross the MetaObjects wire — the field, the
88
generated Zod schema, and the REST payload all carry a plain string.
99

10-
This is a **TS-web-only** feature. The metamodel vocabulary (`view.image` and
11-
its five attrs) is registered by the `metaobjects-ui-web` provider and applied
12-
only in TypeScript; the non-TS ports carry a byte-identical mirror of the spec
13-
file for drift parity but never apply the provider, and none of them ship an
14-
upload widget. A `field.string` authored with a `view.image` child is, to a
15-
Java/Kotlin/C#/Python port, just a plain string field.
10+
This is a **TS-web-only** feature — the upload widget, crop UI and adapter
11+
contract exist only in the TypeScript web client, and no other port ships one.
12+
The `view.image` subtype itself LOADS in every port (all the generic `view.*`
13+
controls register for loading everywhere; they stay manifest-excluded as
14+
PRESENTATION_ONLY — `fixtures/registry-conformance/README.md`), but its five
15+
attrs (`@aspectRatio` … `@maxBytes`) are registered only by the TypeScript
16+
`metaobjects-ui-web` provider, so a `view.image` carrying them is authorable in
17+
TypeScript alone. A backend port reads the field as the plain string it is.
1618

1719
## Authoring: `field.string` + `view.image`
1820

‎docs/features/migrations/base-subtypes-are-not-authorable.md‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@ the owning field's subtype, so a boolean default stays a boolean rather than bei
6767

6868
### `view.base` is the one genuine removal
6969

70-
`view.base` was a view carrying no kind. Core registers only `view.base` and `view.currency`; the
71-
other view subtypes (`view.text`, `view.textarea`, `view.checkbox`, `view.radio`, `view.image`, …)
72-
come from the TypeScript-side UI provider. A project on a port that does not apply that provider
73-
therefore has `view.currency` and nothing else until it does.
70+
`view.base` was a view carrying no kind. At this migration's cut, TypeScript registered all the
71+
concrete view subtypes while the non-TS ports registered only `view.base` and `view.currency` — so
72+
a backend port rejected `view.text` with `ERR_UNKNOWN_SUBTYPE`. That asymmetry is since gone: every
73+
port now registers the generic `view.*` controls (`view.text`, `view.textarea`, `view.checkbox`,
74+
`view.radio`, `view.image`, …) for LOADING, still excluded from the cross-port manifest as
75+
PRESENTATION_ONLY (`fixtures/registry-conformance/README.md`), while the attrs ON those controls
76+
remain registered only by the TypeScript UI provider. The removal stands unchanged: `view.base`
77+
itself is refused in every port.
7478

7579
Nothing is lost that carried information — a `view.base` node declared no kind and no attrs, and
7680
the JVM never accepted one — but if you were using it as a placeholder, delete it rather than

‎server/csharp/MetaObjects/RegistryManifest.cs‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ public static class RegistryManifest
3939
// them as such; `description` stays in commonAttrs);
4040
// - `metadata.base` is a per-port inheritance anchor (Java's), not in the
4141
// cross-port contract — other ports register only `metadata.root`;
42-
// - the 11 generic `view.*` controls are a TS-web-presentation facet (cut
43-
// cross-port; C#/Python deregister them, TS keeps them registered).
42+
// - the generic `view.*` controls are a TS-web-presentation facet. C#
43+
// registers them for LOADING only (CoreTypes, via ViewConstants); this
44+
// filter is what keeps them out of the cross-port manifest.
4445
// ------------------------------------------------------------------
4546

4647
// Wave 3b — the in/out boundary is an EXPLICIT CLASSIFICATION (a reason

‎server/java/metadata/src/test/java/com/metaobjects/registry/RegistryManifestConformanceTest.java‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,12 @@
110110
* ADR-0001/ADR-0005, kept registered but excluded from the manifest) were
111111
* reconciled in SP-G Unit 6b/6b-finish; the {@code value*}/{@code data*}
112112
* vestigial sets were refactor-dropped (Unit 6b).</li>
113-
* <li>Subtype gaps/extras: Java lacks {@code attr.stringarray} and the 11 generic {@code view.*} subtypes
114-
* (checkbox/date/dropdown/hidden/hotlink/month/number/password/radio/text/
115-
* textarea/web), and carries an extra {@code metadata.base} (its
116-
* inheritance anchor; the other ports register only {@code metadata.root}).</li>
113+
* <li>Subtype gaps/extras: Java lacks {@code attr.stringarray} (retired
114+
* vocabulary) and carries an extra {@code metadata.base} (its
115+
* inheritance anchor; the other ports register only {@code metadata.root}).
116+
* The generic {@code view.*} presentation controls — which Java formerly
117+
* did not register (SP-G B-2) — now register for LOADING only
118+
* ({@code PresentationView}) and stay excluded from the manifest.</li>
117119
* </ul>
118120
* <p><strong>SP-G Unit 6a reconciled</strong> (registration-only structural items):
119121
* required-ness flips ({@code identity.primary/secondary/reference.fields},

‎spec/decisions/ADR-0054-base-subtypes-are-not-authorable.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,16 @@ node that declares an anchor rather than a thing has no meaning for codegen or r
124124

125125
**Report the divergence and change nothing.** Rejected: the report was the cheap half, and leaving
126126
one document with two verdicts is the failure the corpora exist to prevent.
127+
128+
## Amendment 1 (2026-10-04) — the concrete `view.*` controls now load in every port
129+
130+
The Consequences paragraph above states that the ports without the TS-side UI provider have
131+
"`view.currency` and nothing else." That was the SP-G B-2 deregistration ruling, and a
132+
loader-parity fix has since superseded its registration half: every port now registers the generic
133+
`view.*` controls (`view.text`, `view.dropdown`, …) for LOADING, so one document carrying them
134+
loads everywhere. They stay TS-web-presentation-only — no backend consumer reads them — and stay
135+
excluded from the cross-port manifest as PRESENTATION_ONLY
136+
(`fixtures/registry-conformance/README.md`); the attrs ON those controls remain registered only by
137+
the TypeScript UI provider. Nothing here reopens the `view.base` removal: the anchors stay
138+
authorable-nowhere, and this amendment only retires the claim that a backend port cannot load a
139+
concrete view.

0 commit comments

Comments
 (0)