← Priority list
Unclaimed

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

Handoff document

Markdown

Lane F24e checkpoint, 2026-10-22

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.

  • API PR: https://github.com/CodexCoder21Organization/DigitalOceanDropletApi/pull/33 ; head ae6496a728eb58adc20f47fd4d471c24491e8572. Full local suite 3/3 first attempt; CI green.
  • WUI PR: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/pull/24 ; head c1547757a954c971c122b0d136a756473f07ed31. Full local suite 97/97 first attempt, including restart and every earlier assertion. The reviewer probe was red 3/3 on the original source; reversal controls are in evidence. CI reports missing unpublished API 0.0.22: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/actions/runs/39741295009/job/119698871240 .
  • Backend branch: https://github.com/CodexCoder21Organization/DigitalOceanDropletServiceServer/tree/wip/laneF24e-age-summary ; head af5e9dee6af313e1d6bfa6289cbb168c957834b9. Targeted restart, strict parsing, close accounting, summary counts, refresh, and real sandbox client checks passed first attempt after the corresponding red controls. Its complete suite was waiting for the shared slot at the final checkpoint. No backend PR exists yet.
  • Evidence and permanent report: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/tree/wip/laneF24e-evidence/out . Findings: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/blob/wip/laneF24e-evidence/out/rF24e-findings.md . Final report: https://github.com/CodexCoder21Organization/DigitalOceanDropletWui/blob/wip/laneF24e-evidence/out/rF24e-final.md . Screenshot, XML counts, source patch and CI detail are in that branch only.

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.

Decision 2026-10-22 06:46 UTC (orchestrator): response source for the age chart

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.

Lane F24d live state ? 2026-10-22T06:39:53.516917+00:00

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.

Decision taken 2026-10-22 06:30 UTC (orchestrator; the owner delegated contract-preserving choices)

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.

Resolve the age-history assertion scope and finish the persistence correction

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.

Owner direction

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.

Mission and current blocker

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.

Findings and completed evidence

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.

  • Baseline at the requested head: new probe red on all three runner attempts.
  • Earlier scenarios at that head: 14/14 green on attempt 1, no attempt-history elements.
  • Only the two record additions removed: new probe green on attempt 1; unchanged testSavedOverviewVisibleDates red on all three attempts because the age-chart timestamp is empty.
  • Restored source: new probe red on all three attempts again; unchanged saved-date scenario green on attempt 1.
  • Regions.kt restored SHA-256: 59816cbc62b065671a475301c0e6d5beea2e913abbf5f2f49f6040d775e96a77.

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.

Relevant PRs and refs

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.

Next steps

  1. Obtain the assertion-scope ruling; the pending asynchronous question recommends backend-owned history after connection availability.
  2. If accepted, write a fail-first backend restart test for a saved full summary carrying its original recorded time. Implement backend persistence and API behavior in a separate PR, without publishing or deploying. Keep the recorded time paired with exactly the counts it describes.
  3. Consume the backend record from the WUI and remove the two new durable WUI age fields. Preserve saved counter dates, count agreement, named-card checks and compatibility with old records. Update only the age-history assertions covered by the ruling, with every edit listed in findings.
  4. Run the permanent probe and the earlier scenarios, checking first-attempt XML. Run the complete local suite once through /tmp/claude-501/-code/79f96be0-ae83-4479-b38c-8894e2722ba8/scratchpad/out/suite-slot.sh scripts/test.bash --local --test . --log result.xml . Refresh changed frames using the existing local screenshot fixture and the webapp-screenshots skill.
  5. Rebase before building and before updating the PR, update the description why-first and name the backend dependency by full URL, push, and observe required bld-build with build-watchman 0.0.21 plain --pr. Never merge, enqueue or deploy.

Reading and operational knowledge

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.

Model usage

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.

Add dependency

Complete this handoff

Moves it out of every priority list and into ArchiveArea.