Resolve age-history assertion scope and finish WUI persistence correction
Lane F24e: API and WUI PRs updated; backend branch saved, complete local suite and backend PR remain
Lane F24e: API and WUI PRs updated; backend branch saved, complete local suite and backend PR remain
The mechanism is that the summary contract did not carry the age distribution, so the WUI created two extra values in its saved record. The backend now owns an exact JSON string with counts and its observation time; the WUI stores that string unchanged and renders its chart from the saved backend value. Current implementation and deterministic controls are saved remotely. This lane is PARTIAL until the backend complete local suite finishes and its companion PR is opened.
Next: clone fresh into a new lane directory, rebase each product branch on main, reproduce the local dependency setup, and run the backend complete suite once through the machine-wide slot. Read first-attempt counts from XML. If green, open the backend PR, add its full URL to both other PR descriptions, and watch it using build-watchman 0.0.21 plain --pr with GitHub polling at least two minutes apart. No publication, product merge, queue action, or deployment is authorized. Do not alter any existing assertions or test parameters.
Publication remains a later orchestrator step: droplet.api:droplet-api:0.0.22 and dropletserviceserver:droplet-service-client:0.0.25. Both versions were checked unclaimed before selection. Local builds and tests used these artifacts installed under ~/.m2/repository. A fresh checkout needs to build those exact versions locally. Add local-only MavenPrebuilt2 repositories (or MavenPrebuilt for the backend call) for file:///home/leslie/.m2/repository, https://kotlin.directory and https://maven-central.storage-download.googleapis.com/maven2. Test scripts also need all three temporary @file:build.kotlin.withartifact.WithRepository annotations because these annotations replace the defaults. Remove local-only settings before committing or pushing. Default Coursier cache seeding and COURSIER_REPOSITORIES do not reach the fresh resolver used by these build helpers.
Backend details for review: fleet-age-summary.json is replaced atomically; incomplete account readings retain the last exact string and time; backend close accounts for accepted filesystem work without holding the scheduling monitor during filesystem I/O. JSON validates integral time/count values, seven exact bucket keys, and bounded nonnegative counts. The lifecycle test holds an atomic move, observes close schedule its existing bound, advances ManualClock, then completes the write and joins close. The public RPC/client test verifies the exact age string. No reflection or mock framework was used.
Process deviations: two support-record commands automatically merged support records, contrary to this lane's no-merge instruction: https://github.com/CodexCoder21Organization/PlanRepository/pull/11148 and https://github.com/CodexCoder21Organization/PlanRepository/pull/11150 . No product PR was merged or queued. One API remote command ended before tests with no observed remote submission identifier. These are recorded in the findings.
Use the summary API: the backend adds the age data the chart needs to its fleet-summary response (API + backend + client change, published and bumped as a normal release). Do NOT fall back to the per-droplet list API — it reintroduces the per-droplet reads the summary API exists to avoid. Publication and the version bump are acceptable work for this item; the web UI caches the new summary field verbatim.
RE-VERIFY: PR remains at e70f29034cf1a4975547e89a26e737ff4700d0c5. build-watchman 0.0.21 plain --pr exited 0 on that unchanged head. No correction is claimed.
The lane copied the reviewer probe unchanged and observed red on all three attempts. Earlier baseline scenarios are 14/14 green on first attempt with no attempt-history records. No existing test or product source changed. The probe is retained as an evidence candidate, not on the PR branch.
Current response-source question: the summary API has no raw creation-time list. The existing backend droplet-list API exposes creation strings but requires additional per-droplet reads, which the summary API was designed to avoid. A new summary property needs API/backend/client changes and an artifact version; this lane excludes publication. A question is pending about using the existing droplet-list response versus preparing API/backend changes with a publication dependency.
Evidence branch: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/tree/wip/laneF24d-evidence at 24582d43b798d7b191a70a07755f9dd2a3fbfef7. Findings: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/blob/wip/laneF24d-evidence/out/rF24d-findings.md . Final lane report: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/blob/wip/laneF24d-evidence/out/rF24d-final.md . No complete suite or screenshots were run because no product correction was made. No backend/API edits, PR updates, deployment, restart, merge, queue action, or artifact publication occurred. The WUI, backend and API checkouts contain no product edits.
The binding decision below remains in effect. The older assertion-scope question in the previous handoff text was resolved by that decision; the response-source question above is the present gate.
The backend owns history. The web UI may keep last-known.json only as a cache-only snapshot: a verbatim copy of what the backend last returned, safe to delete, never a source of truth and never holding values the web UI computed or wrote itself. So the two new web-UI-originated age fields come out. The age chart in the first frame (before the backend connects) is derived at render time from data the snapshot already copies verbatim from the backend, such as each droplet creation time. If the snapshot does not carry what the chart needs, the backend adds it to its fleet response (DigitalOceanDropletServiceServer PR, fail-first test), and the web UI caches that response field verbatim. The restart test keeps its assertions (saved age chart visible before backend setup), counter dates and named-card checks; only how the data is produced changes. The pre-existing last-known.json predates this PR and is in policy as a cache.
Written: 2026-10-22 06:21 UTC.
RE-VERIFY: this is a write-time snapshot. Recheck https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/pull/24 and its head before work. The most recent build-watchman 0.0.21 observation reports required bld-build green on e70f29034cf1a4975547e89a26e737ff4700d0c5. No production state was changed or inspected by this lane.
2026-10-22: Show known data instead of a loading screen, and persist history in the BACKEND (DigitalOceanDropletServiceServer), not in the web UI. The web UI must not add durable state of its own.
The lane also requires the 14 earlier scenarios to remain green, forbids weakening existing tests, and permits no merging, queue action, deployment, restart or Maven publication. Evidence belongs only on wip/laneF24c-evidence. Poll PR state at intervals of at least two minutes. Use local targeted tests, and use the shared suite-slot.sh for any complete local suite.
Fix the two newly persisted WUI age fields while keeping known values and dates visible. A direct public HTTP/file experiment proves that removing the fields satisfies the new storage test but makes an unchanged required restart-date scenario red. A scope ruling is pending: may the affected restart scenarios obtain age history after the backend connection becomes available, while preserving saved counter dates and named-card checks?
The conflict is physical: the required scenario starts a new WUI store from its local file, leaves backend setup pending behind a future, then requires restored age bands and their date. Those age counts come only from the two new local fields. Putting them under another local key or file would retain the same owner-direction discrepancy. Backend persistence cannot make them available before the connection exists under this fixture.
The mechanism is the addition of ageBandCounts and unreadableCreationCount to the WUI summary record at Regions.kt:410-411. These are counts, rather than date fields. The production writer is LastKnownStore, selected by Main.kt.
The backend FleetSummary already exposes producedAt, but getFleetSummary computes it anew. Persisted fleet count history exposes atMillis and count only. No saved full-summary/age-distribution API was found. A backend saved-summary change is needed for backend-owned age history. No backend PR has been opened because the earlier assertion scope is unresolved.
last-known.json itself predates the PR: origin/main already selects a durable WUI record. That is a separate owner-direction discrepancy, recorded without changing it.
The copied reviewer probe is preserved as a permanent-test candidate under out/rF24c-controls/testWuiSummaryRetainsOnlyExistingFields.kts. Its only adaptation is package dropletwui.test. It calls real Jetty HTTP with the in-process account manager and FakeFileSystem, then checks serialized JSON.
No existing test was edited. No complete suite was started: there is no compliant product correction to validate yet. All product source is restored, so there is no rendered-frame change and no screenshot refresh. The PR description is unchanged. Required CI is green only for the unchanged original head.
| Repository | Branch | Verified remote head | PR | Contents and state |
|---|---|---|---|---|
| DigitalOceanDropletWui | https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/tree/wip/laneFRAME-known-data | e70f29034cf1a4975547e89a26e737ff4700d0c5 | https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/pull/24 | Original product source, unchanged by this lane; required bld-build green |
| DigitalOceanDropletWui | https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/tree/wip/laneF24c-evidence | 4b02ef4b2cb5d88753eead3ceeba5f15a733388c | no PR | Evidence through the complete comparison/reversal checkpoint; no product fix |
Evidence entry point: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/blob/wip/laneF24c-evidence/out/rF24c-findings.md . XML, the new test candidate, the two-field comparison patch and build-watchman output are in the adjacent rF24c-controls directory. The evidence branch advances to include this handoff and the final report after the checkpoint named above.
No deployed or published code was created by this lane. All clone/worktree working states were clean at the audit, with no local-only commits. Baseline compilation-progress logs, temporary selection copies and a dependency-resolution thread snapshot are excluded because the retained XML supplies the test evidence and no dependency issue was established.
Read project README files, the earlier review final/findings/probe at https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/tree/wip/laneR24r-review/out , backend ARCHITECTURE.md, https://github.com/CodexCoder21Organization/DocumentationRepository/blob/main/architecture/TESTING.md including Test-Driven Development and Never Calibrate a Reproducer to a Machine, and https://github.com/CodexCoder21Organization/DocumentationRepository/blob/main/PHILOSOPHY.md . No root project AGENTS.md was present in the WUI, backend or API clone.
The test runner can return a successful final result after a later attempt. Inspect attempt-history/attempt elements rather than the final summary alone. A copied directory under .lane is outside test discovery; repeated --test scenarioName flags select the intended 14 cases correctly. There is no need to reproduce the completed comparison again before choosing the scope.
Recorded agent work, including concurrent agents
No model usage has been recorded for this handoff yet.
Record work with handoff-cli usage report hf-2026-10-22-resolve-age-history-assertion-scope-and-finish-wui-persistence-correction.
No status reports yet.
Moves it out of every priority list and into ArchiveArea.