Integrate verified NeitzelLib development runtime baseline
This commit is contained in:
@@ -6,7 +6,7 @@ Shared Scene Builder Kit designer for NeitzelLib FX, with planned standalone and
|
||||
|
||||
This initial repository contains the accepted contracts, bootstrap plan, project instructions and a pinned Maven build foundation (`de.neitzel.fxdesigner:neitzel-fx-designer:0.1.0-SNAPSHOT`). It currently has **no application sources, implemented modules, runnable designer or packaged IntelliJ plugin**. The root POM validates the build environment; it does not yet build a UI. The module layout in the contract is planned work.
|
||||
|
||||
The corrected NeitzelLib dependency is not yet pinned: its Component builder fix must be integrated separately and the first containing release verified. NeitzelLib sources and prototype implementations are not copied here.
|
||||
The Component builder fix is integrated in NeitzelLib main. A [verified local development snapshot](docs/runtime/neitzellib-baseline.md) is recorded with source/artifact identity; a corrected released version is still unestablished. NeitzelLib sources and prototype implementations are not copied here.
|
||||
|
||||
## Validate the foundation
|
||||
|
||||
@@ -34,3 +34,5 @@ The JDK requirement above is for the bootstrap, not a declaration that all futur
|
||||
- [Third-party notices](THIRD-PARTY-NOTICES.md): Maven wrapper provenance.
|
||||
|
||||
The canonical checkout is `/Volumes/PlanckSSD/KI/java/NeitzelFXDesigner`. Its Git remote is `ssh://git@gitea.neitzel.de:2222/konrad/NeitzelFXDesigner.git` and its default branch is `main`.
|
||||
|
||||
Validate the installed corrected development runtime separately with `python3 scripts/check-neitzellib-artifact.py`. This requires the recorded local artifacts; the repository foundation check does not install or publish NeitzelLib.
|
||||
|
||||
@@ -115,7 +115,7 @@ Keep the proven reserved owner-lifetime channel for worker cleanup independent o
|
||||
|
||||
## Library prerequisite and acceptance
|
||||
|
||||
Integrate and test the Component builder fix separately in NeitzelLib, preserve unrelated work, and establish the first released artifact containing it. Declare the resulting supported minimum/capability in designer metadata. Older unsupported versions receive diagnostics, not a hidden adapter. Until release, development fixtures may pin a clearly identified installed snapshot; a SNAPSHOT name alone does not establish fix provenance. The inspected source currently declares `de.neitzel.lib:fx:1.0-SNAPSHOT` with Java 21 / JavaFX 21.0.7, and the fix remains uncommitted. No corrected minimum released version is asserted; see the bootstrap plan for provenance and test-run caveats.
|
||||
Integrate and test the Component builder fix separately in NeitzelLib, preserve unrelated work, and establish the first released artifact containing it. Declare the resulting supported minimum/capability in designer metadata. Older unsupported versions receive diagnostics, not a hidden adapter. Until release, development fixtures may pin a clearly identified installed snapshot; a SNAPSHOT name alone does not establish fix provenance. The corrected source on main declares `de.neitzel.lib:fx:1.0-SNAPSHOT` with Java 21 / JavaFX 21.0.7. The fix and tested local artifact identity are recorded in [runtime provenance](runtime/neitzellib-baseline.md). No corrected minimum released version is asserted.
|
||||
|
||||
Accept the first milestone only when both minimal hosts use the same core/UI/fixtures and demonstrate:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# NeitzelFXDesigner repository bootstrap plan
|
||||
|
||||
Status: repository foundation implemented by the initial commit; work packages 2–7 remain planned. Consolidated 2026-11-12. Scope is the ordered implementation start for the [accepted initial contract](initial-project-contract.md); the initial commit creates the foundation only and does not publish a library release.
|
||||
Status: repository foundation implemented by the initial commit; work package 2 has a verified development artifact; work packages 3–7 remain planned. Consolidated 2026-11-12. Scope is the ordered implementation start for the [accepted initial contract](initial-project-contract.md); the initial commit creates the foundation only and does not publish a library release.
|
||||
|
||||
## Starting-point evidence before bootstrap
|
||||
|
||||
@@ -16,7 +16,7 @@ Status: repository foundation implemented by the initial commit; work packages 2
|
||||
|
||||
## Ordered work packages
|
||||
|
||||
Work package 1 supplies this repository, documentation, pinned wrapper and `python3 scripts/check-bootstrap.py`. Its remote-main and workspace-registration checks are verified during publication. The remaining packages below are not implemented.
|
||||
Work package 1 supplies this repository, documentation, pinned wrapper and `python3 scripts/check-bootstrap.py`. Its remote-main and workspace-registration checks are verified during publication. Work package 2 is now integrated with a verified local development artifact; the remaining implementation packages are not implemented.
|
||||
|
||||
### 1. Bootstrap the independent repository and workspace registration
|
||||
|
||||
@@ -38,6 +38,8 @@ Update the catalog's project count and validate catalog parsing without unnecess
|
||||
|
||||
### 2. Integrate and identify the corrected NeitzelLib artifact
|
||||
|
||||
Completed for development: the isolated Component fix is on NeitzelLib main, all 112 reactor tests and 38 adapter-free smoke checks pass, and the matching local artifacts are recorded in [runtime provenance](runtime/neitzellib-baseline.md). A corrected released minimum remains unset; remote artifact publication is separate. The following procedure is retained for reproducibility.
|
||||
|
||||
Read the library's current instructions/POM and inspect only the Component builder diff, regression fixtures/tests and related documentation. Preserve unrelated local changes. Run relevant library tests and the direct adapter-free smoke scenario. Verify actual test results despite the parent POM's failure-ignore setting. Capture an isolated library change through its normal feature/landing workflow.
|
||||
|
||||
Establish the first release containing the fix through actual artifact/source evidence. Do not invent a minimum version. Until then, fixtures may use a locally installed snapshot with documented source revision, any required patch digest, and build/artifact identity. Record the release/capability prerequisite in compatibility metadata when verified.
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"status": "verified-local-development-snapshot",
|
||||
"sourceRepository": "ssh://git@gitea.neitzel.de:2222/konrad/NeitzelLib.git",
|
||||
"sourceRevision": "2d83fb467cc29b6e7c5aa92c86fc3fb49a504dc0",
|
||||
"minimumReleasedVersion": null,
|
||||
"requiredCapability": "component-fxml-attributes-after-initialization",
|
||||
"javaVersion": "21",
|
||||
"javafxVersion": "21.0.7",
|
||||
"testResults": {
|
||||
"core": {
|
||||
"tests": 1,
|
||||
"failures": 0,
|
||||
"errors": 0,
|
||||
"skipped": 0
|
||||
},
|
||||
"injection": {
|
||||
"tests": 10,
|
||||
"failures": 0,
|
||||
"errors": 0,
|
||||
"skipped": 0
|
||||
},
|
||||
"fx": {
|
||||
"tests": 101,
|
||||
"failures": 0,
|
||||
"errors": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
"adapterFreeCanvasChecks": 38,
|
||||
"artifacts": [
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "neitzellib",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "pom",
|
||||
"repositoryPath": "de/neitzel/lib/neitzellib/1.0-SNAPSHOT/neitzellib-1.0-SNAPSHOT.pom",
|
||||
"sha256": "e1f7931ab7f1e632117a024fd46c9932a95e343f10de8dec3106bf4a9b9dfe3c"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "core",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "pom",
|
||||
"repositoryPath": "de/neitzel/lib/core/1.0-SNAPSHOT/core-1.0-SNAPSHOT.pom",
|
||||
"sha256": "0be257c955a52dbf419ece55675d8eab232d537b1460960e0ca106b16bf71232"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "core",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "jar",
|
||||
"repositoryPath": "de/neitzel/lib/core/1.0-SNAPSHOT/core-1.0-SNAPSHOT.jar",
|
||||
"sha256": "6610e43792818fd5d4d3545d487b28d0cd3faa9b849046a47a4db02c984a144a"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "injection",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "pom",
|
||||
"repositoryPath": "de/neitzel/lib/injection/1.0-SNAPSHOT/injection-1.0-SNAPSHOT.pom",
|
||||
"sha256": "6060ccac3dd2eeb00342ab34028445649716e229e09bea9adbba56dda58d4780"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "injection",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "jar",
|
||||
"repositoryPath": "de/neitzel/lib/injection/1.0-SNAPSHOT/injection-1.0-SNAPSHOT.jar",
|
||||
"sha256": "a582aa71f034370865d486706f55a1fbcc40446c47bf402c28049b205f7c9e25"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "fx",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "pom",
|
||||
"repositoryPath": "de/neitzel/lib/fx/1.0-SNAPSHOT/fx-1.0-SNAPSHOT.pom",
|
||||
"sha256": "4ccebda8f6cb8104aa272f3805263967530f8da259d2712b8ca0aa0c7d6fb356"
|
||||
},
|
||||
{
|
||||
"groupId": "de.neitzel.lib",
|
||||
"artifactId": "fx",
|
||||
"version": "1.0-SNAPSHOT",
|
||||
"extension": "jar",
|
||||
"repositoryPath": "de/neitzel/lib/fx/1.0-SNAPSHOT/fx-1.0-SNAPSHOT.jar",
|
||||
"sha256": "a668ac49f5a44d63e7e115fd93456b581ab05725870affcaf2dede6ec5dbe431"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
# Corrected NeitzelLib development artifact
|
||||
|
||||
The Component builder fix is integrated in [NeitzelLib main at 2d83fb4](https://gitea.neitzel.de/konrad/NeitzelLib/src/commit/2d83fb467cc29b6e7c5aa92c86fc3fb49a504dc0). It collects FXML values, initializes the injected Component and installs its Model listener, then applies values using public FXMLLoader conversion. Both Components in the regression fixture retain the same Model reference; invalid properties and values fail.
|
||||
|
||||
## Artifact identity
|
||||
|
||||
Use `de.neitzel.lib:fx:1.0-SNAPSHOT` with its matching parent, core and injection artifacts. [The manifest](neitzellib-baseline.json) records the exact source commit and SHA-256 hashes of seven installed POM/JAR artifacts. These artifacts are installed in the developer's local Maven repository, not deployed to a remote artifact repository. No corrected released minimum is established and no release tag was created. A source commit on main is not a published release.
|
||||
|
||||
```sh
|
||||
python3 scripts/check-neitzellib-artifact.py
|
||||
# For a non-default Maven repository:
|
||||
python3 scripts/check-neitzellib-artifact.py --repository /path/to/repository
|
||||
```
|
||||
|
||||
This check detects an absent or overwritten snapshot. Maven coordinates alone are insufficient. Artifact bytes have also been compared against every tested compiled class in the isolated build. A fresh rebuild can change JAR timestamps, so it must be validated and its manifest deliberately refreshed; a checksum mismatch must not be automatically accepted.
|
||||
|
||||
## Evidence
|
||||
|
||||
- Unmodified library main plus the new regression fixture: seven tests, one expected loading error in `componentAttributesApplyAfterInitialization`. Maven reported success because its POM hardcodes `testFailureIgnore=true`; the XML result correctly identified the failure.
|
||||
- Corrected isolated main-based build: core **1**, injection **10**, fx **101** tests, all passing with zero failures, errors or skips. The Component test class contains seven passing cases.
|
||||
- Adapter-free Kit canvas/runtime smoke scenario: **38 passing checks**, including direct loading of the saved original FXML. It used JavaFX 21.0.7 in the target and the existing Kit 26 prototype host.
|
||||
- `clean install` completed using JDK 21 and the library's Maven 3.9.11 wrapper, including its configured report-generation/package phases. Test report totals, not the Maven exit status alone, are the test acceptance evidence. This does not claim new module-path, plugin or cross-platform qualification.
|
||||
|
||||
## Rebuild from clean source
|
||||
|
||||
Use a clean checkout at the manifest's source revision; the canonical library checkout currently also contains unrelated native-desktop work. Keep that work separate. Run:
|
||||
|
||||
```sh
|
||||
# In the clean NeitzelLib checkout, with JAVA_HOME pointing to JDK 21:
|
||||
./mvnw -B -ntp -pl fx -am -Dversions.skip=true -Dmaven.test.failure.ignore=false clean install
|
||||
```
|
||||
|
||||
The command-line failure-ignore property does not override the existing hardcoded POM setting. Inspect every `TEST-*.xml` report under `core`, `injection` and `fx`: require nonempty reports and zero failures/errors/skips before accepting the install. Re-run the direct adapter-free scenario before changing the recorded capability baseline. Record source revision and installed artifact hashes together after acceptance; do not silently reuse the old hashes for a new build.
|
||||
|
||||
The regression source covers custom/inherited properties, numeric/boolean/enum conversion, XML text escaping, attached layout constraints, post-initialization setters, shared Model identity/write-back and invalid values. The original canonical library branch and its working-tree changes were left untouched; only the isolated eight-file Component change was integrated into main.
|
||||
@@ -10,7 +10,7 @@ import sys
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
wrapper = ROOT / ("mvnw.cmd" if os.name == "nt" else "mvnw")
|
||||
subprocess.run([str(wrapper), "--batch-mode", "--no-transfer-progress", "clean", "verify"], cwd=ROOT, check=True)
|
||||
for document in [ROOT / "README.md", ROOT / "AGENTS.md", ROOT / "THIRD-PARTY-NOTICES.md", *sorted((ROOT / "docs").glob("*.md"))]:
|
||||
for document in [ROOT / "README.md", ROOT / "AGENTS.md", ROOT / "THIRD-PARTY-NOTICES.md", *sorted((ROOT / "docs").rglob("*.md"))]:
|
||||
content = document.read_text(encoding="utf-8")
|
||||
for example in re.findall(r"```json\n(.*?)\n```", content, re.S):
|
||||
json.loads(example)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verify that the locally installed development runtime matches the tested artifact."""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--repository", type=Path, default=Path.home() / ".m2/repository")
|
||||
args = parser.parse_args()
|
||||
manifest = json.loads((ROOT / "docs/runtime/neitzellib-baseline.json").read_text())
|
||||
errors = []
|
||||
for artifact in manifest["artifacts"]:
|
||||
path = args.repository / artifact["repositoryPath"]
|
||||
if not path.is_file():
|
||||
errors.append(f"Missing: {path}")
|
||||
elif hashlib.sha256(path.read_bytes()).hexdigest() != artifact["sha256"]:
|
||||
errors.append(f"Different build: {path}")
|
||||
if errors:
|
||||
print("\n".join(errors), file=sys.stderr)
|
||||
sys.exit("Runtime identity mismatch. See docs/runtime/neitzellib-baseline.md; do not bypass this check merely because the version is 1.0-SNAPSHOT.")
|
||||
print(f"PASS {len(manifest['artifacts'])} runtime artifacts match tested source {manifest['sourceRevision']}; no corrected release version is claimed")
|
||||
Reference in New Issue
Block a user