Skip to content

The .test manifest carries the picker rule, the list columns and the parent state a child refuses - #7681

Merged
delchev merged 1 commit into
eclipse-dirigible:masterfrom
nedelcho-delchev-tues:issue-7663-apptest-manifest-curation
Oct 5, 2026
Merged

delchev merged 1 commit into
eclipse-dirigible:masterfrom
nedelcho-delchev-tues:issue-7663-apptest-manifest-curation

Conversation

@nedelcho-delchev-tues

Copy link
Copy Markdown
Contributor

Fixes #7663
Fixes #7664
Fixes #7667

The app-test manifest described a relation as "pick any row of the target" and a list as "a header per non-major: false field". The generic flows therefore built samples the generated app then rejected, and the three issues are the same gap seen from three sides:

Three keys, in the manifest's own vocabulary rather than a second one beside it:

Key Where What it carries
pickable relation {when: [{by, op, value}], hide}, parsed by PickableSupport from the same terms the generated picker evaluates. op is eq/ne/present/absent; a presence test carries no value.
forbiddenTarget relation the entity's own forbidWhen terms that reach one hop through that relation, each with the check's message. This is the half the REST flow needs, since it never sees a picker.
list entity the .model's listOrder — the curated columns, in order.

by is the name where already uses, and a numeric literal stays a number so the runner compares it with the stored id.

All three are emitted only when authored, so an uncurated module's manifest is byte-identical. Covered by AppTestIntentGeneratorTest (one test for the curated, guarded module and one pinning that an uncurated relation carries none of them). The engine-intent suite is green: 1481 tests.

Note for the SDK side: the flows have to read these. This change is the manifest half.

…parent state a child refuses

The app-test manifest described a relation as "pick any row of the target" and
a list as "a header per non-major:false field", so the generic flows built
samples the generated app then rejected:

- a picker narrowed by `pickable:` never offered the first target row, so the
  record never saved (eclipse-dirigible#7663);
- a list curated with `list:` was asserted to render a column the page
  deliberately hides - and only on the first instance that held a row, since
  an empty list never reaches the assertion (eclipse-dirigible#7664);
- a child guarded by a `forbidWhen` over its parent's status had its REST
  create answered 400 by a rule nothing in the manifest mentioned (eclipse-dirigible#7667).

Three keys close it, each in the manifest's own vocabulary rather than a
second one:

- a relation's `pickable` - `{when: [{by, op, value}], hide}`, parsed by
  `PickableSupport` from the same terms the generated picker evaluates;
- a relation's `forbiddenTarget` - the entity's own `forbidWhen` terms that
  reach one hop through THAT relation, with the check's message, which is what
  the REST flow needs since it never sees a picker;
- the entity's `list` - the `.model`'s `listOrder`, in order.

All three are emitted only when authored, so an uncurated module's manifest is
byte-identical.

Fixes eclipse-dirigible#7663
Fixes eclipse-dirigible#7664
Fixes eclipse-dirigible#7667

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@delchev
delchev merged commit 2e70370 into eclipse-dirigible:master Oct 5, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment