Discover Model paths and compatible binding targets in both hosts

Add non-constructing target metadata and a shared read-only browser for the Person fixtures. Negotiate binding discovery independently, preserve FXML, and explain direction/type mismatches. Record remaining manual navigation checks as explicitly skipped.
This commit is contained in:
2026-11-13 08:57:35 +01:00
parent 2156894fa8
commit 2fe408bb4d
38 changed files with 1087 additions and 37 deletions
+33
View File
@@ -0,0 +1,33 @@
# Shared Model and binding-target discovery
This is the first stage-4 implementation slice: a read-only binding browser shared by standalone and IntelliJ. Binding declaration edits, Converter selection, generated metadata and the complete inspector remain subsequent work.
## Use
Build and Refresh a fixture, expand **Bindings — discovery** below the designer, and select **Discover bindings**. Select a Model path and direction (`view`, `model`, `both`); compatible targets appear first, followed by unresolved targets and mismatches with explanations. Discovery leaves the authoritative FXML and undo history untouched. Errors leave source editing available.
The document explicitly declares its Model in `<?neitzel-model fixture.model.Person?>`. A missing declaration prompts for it; an example Model is not silently substituted. Fixtures now declare Person for Person/Full Views and Address for their Component resources.
For Person the browser exposes `name`, `rank`, `home`, `home.street`, and `visits`, including Address as the collection element type. The current document's controls are indexed by fx:id. Nested Component internals belong to their own documents. The browser does not offer fx:define objects as scene controls.
## Metadata boundary
The fresh target worker loads classes without initialization and inspects signatures. It never constructs Models, Controllers, providers, controls or Converters, never invokes getters/property accessors, and never starts JavaFX. Application types stay outside both hosts. The independently negotiated `bindings-v1` capability adds the BINDINGS operation; it uses bounded UTF-8 metadata, build/context identity and document revisions, with zero image dimensions. Existing wire operation ordinals remain unchanged.
Model fallback follows NeitzelLib's public read/write JavaBean Attribute rules and simple/complex/collection classification. Nested paths expand to depth four with cycle diagnostics; collection paths expose declared element types without pretending a collection is a single nested Model. Explicit custom BeanInfo is not executed: types requiring it report a generated-metadata diagnostic. This slice does not yet expose custom/replacement ViewModel members, generated metadata, Computed methods or library-provided message properties. Its compatibility results describe the Model-Attribute binding case, not the complete custom ViewModel API.
Targets come from public instance JavaFX observable-property accessors. The runtime requires writable `Property` accessors, so read-only targets remain visible as incompatible. Generic observable signatures and getter types identify the value type; incomplete or contradictory signatures remain unresolved. Component `model` targets use the Component resource's explicit Model declaration instead of treating Object as a specific type. Component resource metadata comes from the selected build; current-document metadata comes from the captured draft.
Compatibility uses boxed declared types and target-runtime assignability: `view` tests Model-to-control, `model` the reverse, and `both` requires both. No implicit numeric/string conversion is assumed. Type mismatches require a compatible Converter; Converter availability/signatures are not yet discovered. Unknown Object types and collection variance remain unresolved, rather than being advertised as verified bindings. Results are potential type matches, not a check that a target is currently unbound or that all runtime access/injection conditions hold.
## Freshness and limits
Discovery owns a separate workflow so it does not replace the canvas or interactive worker. It uses a leased successful build and a captured current-document overlay. Generation and document-revision checks reject obsolete replies. Document changes clear the target list and require rediscovery; Build and Refresh invalidates the panel. Explicit retained-build selection is identified in the displayed provenance. Closed editors cancel their metadata worker.
FXML parsing disables external entities and DOCTYPE. Inputs, scene-node counts, path expansion, target counts and protocol payloads are bounded. Ambiguous imports, duplicate IDs, missing classes, invalid XML and absent declarations produce diagnostics. Custom ViewModel selection, attached-property binding discovery, open child-draft metadata overlays, generated metadata precedence and complete collection compatibility remain later extensions, not silently inferred support.
## Qualification
Tests cover non-initializing signature discovery, nested and collection metadata, direction-dependent assignability, read-only targets, incompatible targets, secure parsing, metadata codec bounds and capability negotiation. Real classpath/module-path Person fixtures check Component Model compatibility and absence of Model, Controller and provider construction/initialization. Connected contracts test the worker protocol in both document adapters; live shared Kit checks use the same browser in standalone and the registered IntelliJ editor and verify source preservation.
Qualification on 2026-11-13 passed: 69 Maven tests and 7 IntelliJ adapter tests; 34 target processes with 424 assertions; connected discovery checks in both document adapters (112 total workflow assertions); live shared-browser checks in standalone and registered IntelliJ for classpath and module-path applications. The existing 48 worker lifecycle cycles, owner-death checks, JavaFX 26 native isolation, package/bytecode boundaries and documentation checks also passed. No new native crash report appeared. Local run logs are `/tmp/binding-bootstrap.log` and `/tmp/binding-registered-ide.log`. The remaining stage-3 human tests are [explicitly skipped by user decision](manual-runtime-navigation.md); automated evidence and reported manual passes remain distinct.
+4
View File
@@ -104,3 +104,7 @@ Scoped Maven build planning and immutable successful-build snapshots are now [im
## Stage-3 additive preview capabilities
The [runtime session implementation](target-runtime-sessions.md) adds negotiated `layout-v1` (MEASURE/OCCURRENCES) and `interactive-v1` operations without changing existing operation ordinals. The optional Preview configuration fields `requestTimeoutSeconds` and `readinessTimeoutSeconds` are schema-validated and default to 30 and 20 seconds. Readiness cannot exceed the request deadline. Measurement metadata and images retain full session/build/document/size correlation.
## Binding discovery capability
The optional `bindings-v1` metadata capability negotiates the appended BINDINGS operation. Requests carry context/build identity and non-empty document revisions, zero image dimensions, and bounded metadata fields `fxml`, `path`, and `direction`. Results use binding metadata format 1 (Model, Attributes, targets, compatibility and diagnostics). Unsupported metadata majors reject required capability negotiation. See the [shared discovery slice](binding-discovery.md).
+20 -20
View File
@@ -1,6 +1,6 @@
# Manual runtime navigation and interactive preview review
Status: the standalone classpath sequence below passed through human review in the development conversation. The corresponding IntelliJ review is next; the overall stage-3 human gate remains open.
Status: review ended at the user’s request; accepted to proceed on 2026-11-13. Standalone checks passed. The first eight IntelliJ checks passed; the remaining checks are explicitly skipped, not assumed to have passed. No additional manual tests are scheduled for this gate.
## Baseline
@@ -10,28 +10,28 @@ NeitzelFXDesigner `7b1d754`, including the native worker shutdown correction; ma
| Scenario | Standalone | IntelliJ |
| --- | --- | --- |
| Full → home opens AddressForm separately and preserves parent | Passed | Pending |
| Opening home again reuses the existing editor | Passed | Pending |
| AddressForm → nested opens NoteForm with both ancestors open | Passed | Pending |
| Repeat visits opens/reuses AddressForm without parent layout changes | Passed | Pending |
| Explicit Open Row Component opens VisitRow without parent layout changes | Passed | Pending |
| Independent VisitRow example renders and accepts street edits | Passed | Pending |
| Closing preview and rerunning creates one fresh sample window | Passed | Pending |
| Stop preview and rerun preserve editor responsiveness | Passed | Pending |
| Unsaved source comment marks preview outdated and preserves edited sample state | Passed | Pending |
| Save restarts exactly one preview with fresh data and clears outdated indication | Passed | Pending |
| Closing VisitRow editor closes its preview; reopening succeeds | Passed | Pending |
| Full Table-row street edits immediately update home/repeated labels | Passed | Pending |
| Invalid numeric input followed by 42 recovers; shared street editing remains responsive | Passed | Pending |
| Parent draft and one-step Undo/Redo survive navigation to home and back | Passed | Pending |
| Explicit rerun uses current unsaved draft, resets sample state and clears outdated indication | Passed | Pending |
| Closing AddressForm editor closes only its own preview; Full remains interactive | Passed | Pending |
| Reopened AddressForm builds/renders/previews while Full retains its edited sample data | Passed | Pending |
| Full → home opens AddressForm separately and preserves parent | Passed | Passed |
| Opening home again reuses the existing editor | Passed | Passed |
| AddressForm → nested opens NoteForm with both ancestors open | Passed | Passed |
| Repeat visits opens/reuses AddressForm without parent layout changes | Passed | Passed |
| Explicit Open Row Component opens VisitRow without parent layout changes | Passed | Passed |
| Independent VisitRow example renders and accepts street edits | Passed | Passed |
| Closing preview and rerunning creates one fresh sample window | Passed | Passed |
| Stop preview and rerun preserve editor responsiveness | Passed | Passed |
| Unsaved source comment marks preview outdated and preserves edited sample state | Passed | Skipped (user decision) |
| Save restarts exactly one preview with fresh data and clears outdated indication | Passed | Skipped (user decision) |
| Closing VisitRow editor closes its preview; reopening succeeds | Passed | Skipped (user decision) |
| Full Table-row street edits immediately update home/repeated labels | Passed | Skipped (user decision) |
| Invalid numeric input followed by 42 recovers; shared street editing remains responsive | Passed | Skipped (user decision) |
| Parent draft and one-step Undo/Redo survive navigation to home and back | Passed | Skipped (user decision) |
| Explicit rerun uses current unsaved draft, resets sample state and clears outdated indication | Passed | Skipped (user decision) |
| Closing AddressForm editor closes only its own preview; Full remains interactive | Passed | Skipped (user decision) |
| Reopened AddressForm builds/renders/previews while Full retains its edited sample data | Passed | Skipped (user decision) |
The numeric recovery check demonstrates observed UI recovery; automated target checks establish Model conversion semantics. Controller actions and source-origin cases retain their recorded automated evidence; this review does not claim additional human observation of those cases.
## Next check
## Acceptance boundary
Launch the isolated IntelliJ classpath fixture on this baseline, open Full.fxml in Neitzel Designer, then Build and Refresh. First verify Open Component → home opens AddressForm in another editor tab while Full remains open. Continue the matching sequence above, adapting window ownership to IDE tabs. Preserve the completed standalone observations instead of restarting them.
The user stopped before the IntelliJ unsaved-draft test and authorized continuing with shared discovery. Remaining IntelliJ checks and any separate human module-path repetition are skipped. Automated qualification remains recorded separately; waived human checks are not evidence of observed behavior.
See [runtime implementation](target-runtime-sessions.md) and [native lifecycle correction](native-worker-lifecycle.md).
+7 -1
View File
@@ -98,4 +98,10 @@ Roadmap stage 2 now has source-range transactions, broader Component projection
## Target-runtime sessions, sizing and navigation
Stage 3 now has retained workers, scoped occurrences and target measurements, shared sizing/refresh, independent interactive preview, and Component/Row source navigation. See [implementation and qualification](target-runtime-sessions.md). Keep the new human navigation/interactive review open until its workflows are observed; the completed stage-2 drag/resize review does not automatically qualify these actions.
Stage 3 now has retained workers, scoped occurrences and target measurements, shared sizing/refresh, independent interactive preview, and Component/Row source navigation. See [implementation and qualification](target-runtime-sessions.md). The human navigation review records standalone and initial IntelliJ passes; on 2026-11-13 the user explicitly skipped the remainder and accepted moving to shared discovery. Skipped checks are not reported as passed.
Manual review disposition (2026-11-13): the user accepted proceeding after the recorded standalone and initial IntelliJ passes. Remaining human checks are [skipped explicitly](manual-runtime-navigation.md), not passed. Continue with shared discovery.
## Shared discovery: first stage-4 slice
Implemented the [read-only binding browser](binding-discovery.md) in the shared Kit UI: target-side Person Attribute/path and collection-element discovery, Component Model declarations and direction-aware binding-target compatibility. Real classpath and module-path fixtures qualify both hosts. Binding creation/editing and the remaining metadata categories retain their subsequent work packages.
+6 -4
View File
@@ -44,9 +44,9 @@ Reactor sources are editable. IntelliJ can also find source/resource pairs in op
The qualification runs passed 64 Maven tests and 7 IntelliJ adapter tests; 32 target processes executed 402 fixture checks. Connected workflow checks cover both hosts with classpath and module-path applications (100 assertions), including native shared Kit rendering and interactive draft/save lifecycle. Registered IntelliJ checks additionally verify the actual designer extension and exclusive JavaFX 26 native libraries.
Run the bootstrap and registered IDE commands in [README](../README.md). A successful automated run does not close the human navigation/interactive review: verify parent → Component → nested Component, repeated open/reuse, independent examples, interactive editing, save-triggered restart, and closing/reopening preview in both hosts. The completed stage-2 mouse review remains valid for its artifact; input changes should receive focused retesting.
Run the bootstrap and registered IDE commands in [README](../README.md). The original human-review sequence was: verify parent → Component → nested Component, repeated open/reuse, independent examples, interactive editing, save-triggered restart, and closing/reopening preview in both hosts. The completed stage-2 mouse review remains valid for its artifact; input changes should receive focused retesting.
## Next human review (both hosts)
## Human review sequence and disposition
1. Open `Full.fxml`, Build and Refresh, and select its `full` example. Select AddressForm and use Open Component. Confirm a separate editor opens and repeated opening reuses it, with the parent draft intact.
2. Build and Refresh the child; verify its independent example, then open nested NoteForm. Return to the parent and check selection/editability and Undo/Redo.
@@ -54,12 +54,14 @@ Run the bootstrap and registered IDE commands in [README](../README.md). A succe
4. Start Interactive preview. Edit the street and exercise the action button and Table. Make an unsaved designer edit: the running sample state should remain and show outdated status. Save: preview should restart with fresh sample data and the saved change.
5. Close the interactive window, rerun it, stop it, and close the owning editor. Check that windows close and can be opened again. Repeat with the module-path fixture and IntelliJ host.
The standalone classpath sequence has passed the [recorded human review](manual-runtime-navigation.md). IntelliJ review is next; the overall human gate remains open. Automated window/control checks do not count as human acceptance.
The standalone classpath sequence has passed the [recorded human review](manual-runtime-navigation.md). The first eight IntelliJ checks also passed; the user skipped the remaining checks and accepted proceeding on 2026-11-13. Automated window/control checks do not count as human acceptance.
## Native-runtime lifecycle correction
The native JavaFX 21 target-worker crash observed during stage-3 qualification has been reproduced and corrected. See the [diagnosis, shutdown contract and lifecycle regression](native-worker-lifecycle.md). The runners now reject native crash reports even when UI assertions pass. Human navigation and interactive-preview review remains open.
The native JavaFX 21 target-worker crash observed during stage-3 qualification has been reproduced and corrected. See the [diagnosis, shutdown contract and lifecycle regression](native-worker-lifecycle.md). The runners now reject native crash reports even when UI assertions pass. The remaining human review was explicitly skipped by the user; see its recorded disposition.
## Boundaries
Qualification remains the recorded macOS arm64 / OpenJDK 25 / JavaFX and Kit 26 / IntelliJ 263.7307.200 host baseline and Java 21 / JavaFX 21.0.7 target fixtures. New protocol fields and preview behavior are development contracts, not a frozen public release. Structural authoring, binding/generation panels, production host handoff, broader platform coverage and packaging retain their later gates. VoiceOver remains outside scope.
Manual review disposition (2026-11-13): the user accepted proceeding after the recorded standalone and initial IntelliJ passes. Remaining human checks are [skipped explicitly](manual-runtime-navigation.md), not passed. Continue with shared discovery.
+1 -1
View File
@@ -1,6 +1,6 @@
# Target-runtime sessions, sizing and Component navigation
Status: stage-3 implementation and automated qualification are described in the [runtime implementation report](target-runtime-sessions.md). The new navigation/interactive human review remains a separate gate. This document retains the implementation sequence and acceptance criteria. Stage 2's [manual input gate](manual-input-validation.md) is closed on its recorded baseline. This work implements the accepted preview and host contracts; it does not reopen them as Wayfinder decisions.
Status: stage-3 implementation and automated qualification are described in the [runtime implementation report](target-runtime-sessions.md). The [human review](manual-runtime-navigation.md) records observed passes and the user’s decision to skip the remaining checks and proceed. This document retains the implementation sequence and acceptance criteria. Stage 2's [manual input gate](manual-input-validation.md) is closed on its recorded baseline. This work implements the accepted preview and host contracts; it does not reopen them as Wayfinder decisions.
## Starting implementation and gaps (before this stage)