Record verified Component runtime snapshot and artifact checks

This commit is contained in:
2026-11-12 07:30:35 +01:00
parent 953f01a19c
commit 5fc3ee23fc
7 changed files with 157 additions and 5 deletions
+3 -1
View File
@@ -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.
+1 -1
View File
@@ -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:
+4 -2
View File
@@ -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.
+89
View File
@@ -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"
}
]
}
+35
View File
@@ -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.
+1 -1
View File
@@ -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)
+24
View File
@@ -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")