Document localized workflows and water map calibration
This commit is contained in:
@@ -36,13 +36,13 @@ Staging currently exercises the PostgreSQL → API → frontend path with synthe
|
||||
### SolidJS frontend
|
||||
|
||||
- Queries the backend using the same origin in production builds.
|
||||
- Provides Stations, City Analysis, Faktiskā, Ūdens temperatūra, Latvia overview, Database, HARMONIE, and LVGMC forecast workspaces.
|
||||
- Provides Stacijas, Kartes, Faktiskā, Ūdens, Apskats, Arhīvs, Harmonie, and LVĢMC workspaces.
|
||||
- Uses HTML canvas for broadcast maps and PNG export.
|
||||
- Uses normalized transparent PNG assets for weather symbols; the internal letter codes remain stable identifiers and are not rendered as text or emoji.
|
||||
|
||||
### PostgreSQL
|
||||
|
||||
- Stores normalized weather observations used by Stations, City Analysis, Faktiskā, and Latvia overview.
|
||||
- Stores normalized weather observations used by Stacijas, Kartes, Faktiskā, and Apskats.
|
||||
- Is accessible only inside the isolated Compose network in staging.
|
||||
- Uses a bind-mounted `postgres/` runtime directory in the current Compose configuration.
|
||||
|
||||
@@ -57,7 +57,7 @@ Staging currently exercises the PostgreSQL → API → frontend path with synthe
|
||||
|
||||
## Broadcast-map flow
|
||||
|
||||
### City Analysis temperature maps
|
||||
### Kartes temperature maps
|
||||
|
||||
Queried city values are placed at predefined coordinates on one of four map backgrounds:
|
||||
|
||||
@@ -76,9 +76,9 @@ Weather symbols and wind values remain manual editorial inputs. One symbol can b
|
||||
|
||||
The renderer attaches each normalized 256×256 weather image to the measured edge of its temperature badge. All assets share one canvas, center, and scale, so placement does not depend on font bearings or baselines. The configuration permits per-station offsets when later production comparison requires them. Operator input selects the symbol but never controls its coordinates.
|
||||
|
||||
### Ūdens temperatūra
|
||||
### Ūdens
|
||||
|
||||
Ūdens temperatūra is an independent fixed-template renderer. Its six ranges are currently manual editorial inputs rather than station-query results. A Latvian-named field configuration maps each water area to locked canvas coordinates. The workflow produces explicit 1920×1080 and 3840×1440 canvases and filenames; each size still requires comparison against newsroom output.
|
||||
Ūdens is an independent fixed-template renderer. Its six ranges are manual editorial inputs rather than station-query results. The 1920×1080 and 3840×1440 products use separate authoritative templates and six separately measured value rectangles. Canvas `TextMetrics` visible-glyph bounds center the Monda text optically inside each rectangle. Preview scaling never changes native export geometry, and both output sizes have been visually validated against the supplied newsroom templates.
|
||||
|
||||
Monda Regular and Bold are bundled locally and used by the interface and generated text. Weather symbols are bundled as independent transparent PNG assets.
|
||||
|
||||
|
||||
@@ -94,11 +94,11 @@ At minimum, verify:
|
||||
1. `docker compose ps` reports PostgreSQL healthy and Scala running.
|
||||
2. `/` returns HTTP 200.
|
||||
3. The home navigation loads.
|
||||
4. City Analysis can query synthetic observations.
|
||||
4. Kartes can query synthetic observations.
|
||||
5. Each map resolution renders and downloads.
|
||||
6. Faktiskā automatically loads the latest fixed-station temperatures, allows overrides, assigns normalized image symbols, supports exceptions, and downloads a 3840×1440 PNG.
|
||||
7. Faktiskā symbols remain automatically attached to their corresponding temperature badges when several different image assets are tested.
|
||||
8. Ūdens temperatūra accepts all six manual ranges and exports both 1920×1080 and 3840×1440 PNGs.
|
||||
8. Ūdens accepts all six manual ranges and exports its independently calibrated 1920×1080 and 3840×1440 templates with optically centered values.
|
||||
9. Browser developer tools show no new runtime errors.
|
||||
|
||||
For frontend dependency maintenance, validate the committed lockfile from a clean install rather than relying on an already-mutated `node_modules` tree:
|
||||
@@ -121,7 +121,7 @@ The public Nginx configuration deliberately handles `/api/` separately from
|
||||
browser page requests. An expired Authelia session must return the original
|
||||
HTTP 401 to an API request; it must not redirect `fetch`/XHR to
|
||||
`auth.laikapstak.li`. A cross-origin authentication redirect is blocked by the
|
||||
browser as CORS and previously left City Analysis appearing to load forever.
|
||||
browser as CORS and previously left Kartes appearing to load forever.
|
||||
|
||||
The frontend also applies a 30-second query timeout and presents explicit
|
||||
session, network, HTTP, unexpected-response, and empty-result messages. When
|
||||
@@ -129,7 +129,7 @@ changing the authentication or proxy configuration, verify both an authorized
|
||||
query and an expired-session query rather than checking page navigation alone.
|
||||
|
||||
The UAT synthetic dataset is time-bounded. If its latest observation predates
|
||||
the default City Analysis range, refresh the small test seed; an empty result is
|
||||
the default Kartes range, refresh the small test seed; an empty result is
|
||||
not an ingestion or authentication failure. Synthetic data exists only for
|
||||
visual workflow testing and must be removed before real provider ingestion.
|
||||
|
||||
@@ -153,7 +153,7 @@ The temporary VPS must not become another development checkout. The proposed rel
|
||||
Windows source and Git -> Rocky build and verification -> immutable image + checksum -> VPS deployment
|
||||
```
|
||||
|
||||
Releases are manual during user acceptance and are identified by the source commit SHA. The first installed release was `7dbc55b`; the current UAT release is `ef64895`, deployed with its full immutable image tag. Release `16a8c68` is retained as the immediate application rollback. The VPS keeps WeatherTool in its own `/srv/weathertool` tree, publishes the application only to loopback ports, and relies on Cloudflare, Nginx, and Authelia at the public boundary. See `VPS_STAGING_PLAN.md` before changing the VPS deployment.
|
||||
Releases are manual during user acceptance and are identified by the source commit SHA. The first installed release was `7dbc55b`; the current UAT release is `df911f1`, deployed with its full immutable image tag. Release `ef64895` is retained as the immediate application rollback. The next candidate includes explicit JSON API response types, Latvian workflow labels, and independently calibrated water-temperature templates. The VPS keeps WeatherTool in its own `/srv/weathertool` tree, publishes the application only to loopback ports, and relies on Cloudflare, Nginx, and Authelia at the public boundary. See `VPS_STAGING_PLAN.md` before changing the VPS deployment.
|
||||
|
||||
The committed templates live under `deploy/vps/`. They are not a second local
|
||||
development environment. Validate them on Rocky, build the exact Git revision,
|
||||
|
||||
+13
-13
@@ -10,13 +10,13 @@ Operator-facing workspace names, map names, export names, and production labels
|
||||
|
||||
Entry point and navigation overview. It identifies the development dataset and links to each workspace.
|
||||
|
||||
## Stations
|
||||
## Stacijas
|
||||
|
||||
Purpose: inspect station-focused observations, map values, and open detailed charts for a selected station.
|
||||
|
||||
Current status: inherited workflow; still requires detailed workplace validation and UI review.
|
||||
|
||||
## City Analysis
|
||||
## Kartes
|
||||
|
||||
Purpose: compare historical observations across selected cities.
|
||||
|
||||
@@ -85,9 +85,9 @@ Completed Faktiskā checkpoint:
|
||||
|
||||
Valmiera is included in the development seed so all 13 fixed positions can be exercised. Confirmed Monda Regular/Bold files are now bundled and used. The export dimensions are locked, but final pixel-level placement must still be compared against the production masters after the font change.
|
||||
|
||||
## Ūdens temperatūra
|
||||
## Ūdens
|
||||
|
||||
Purpose: prepare the fixed water-temperature newsroom map as a separate production workflow. It must not be mixed into Faktiskā or City Analysis.
|
||||
Purpose: prepare the fixed water-temperature newsroom map as a separate production workflow. It must not be mixed into Faktiskā or Kartes.
|
||||
|
||||
Authoritative references:
|
||||
|
||||
@@ -96,37 +96,37 @@ Authoritative references:
|
||||
|
||||
Required behavior:
|
||||
|
||||
1. Open the dedicated **Ūdens temperatūra** workspace.
|
||||
1. Open the dedicated **Ūdens** workspace.
|
||||
2. Display the fixed set of Latvian-named water-temperature fields.
|
||||
3. Enter or correct every water temperature manually.
|
||||
4. Place values automatically at their locked production positions.
|
||||
5. Preview and download either a 1920×1080 or 3840×1440 PNG.
|
||||
|
||||
The background, title, source, field set, and value positions remain fixed. Only the water-temperature values are routinely edited. Both output sizes are production requirements and must be validated independently; implementation must not assume that browser preview dimensions define export geometry.
|
||||
The 1920×1080 and 3840×1440 products are independent authoritative canvases. Neither is derived by resizing or reflowing the other. Each template contains the fixed newsroom artwork and six separately measured value rectangles.
|
||||
|
||||
When switching output size, the background may use the target canvas aspect ratio, but boxes, typography, and nameplate elements must scale uniformly. They must never be independently stretched on the horizontal and vertical axes.
|
||||
The renderer uses canvas `TextMetrics` visible-glyph bounds (`actualBoundingBoxLeft`, `actualBoundingBoxRight`, `actualBoundingBoxAscent`, and `actualBoundingBoxDescent`) to optically center Monda text inside each rectangle. The browser preview scales the complete canvas only; downloaded PNGs retain their native dimensions.
|
||||
|
||||
Implementation status: first working version implemented. The page provides six Latvian-named manual min/max controls, automatic fixed placement, Monda rendering, explicit resolution selection, completeness validation, and Latvian PNG filenames. Pixel-level comparison and independent calibration of both output sizes remain required.
|
||||
Implementation status: both native exports are implemented and visually validated against the supplied production templates. Later newsroom feedback can still tune the per-template rectangles without changing the manual-entry workflow.
|
||||
|
||||
## Latvia overview
|
||||
## Apskats
|
||||
|
||||
Purpose: aggregate selected fields across Latvia for a selected time range.
|
||||
|
||||
Current status: inherited workflow; terminology, units, and workplace use still need validation.
|
||||
|
||||
## Data archive
|
||||
## Arhīvs
|
||||
|
||||
Purpose: inspect available database dates and individual stored records/files.
|
||||
|
||||
Current status: inherited technical/administrative workflow. Access control and export correctness require review before production use.
|
||||
|
||||
## HARMONIE
|
||||
## Harmonie
|
||||
|
||||
Purpose: inspect and render forecast-model GRIB fields.
|
||||
|
||||
Development limitation: no representative HARMONIE GRIB fixtures are currently included, and valid external-provider access is not configured in staging.
|
||||
|
||||
## LVGMC forecast
|
||||
## LVĢMC
|
||||
|
||||
Purpose: display prepared LVGMC forecast products and broadcast tables.
|
||||
|
||||
@@ -137,5 +137,5 @@ Development limitation: representative forecast CSV fixtures are not currently i
|
||||
- Whether weather conditions can eventually be populated automatically and which provider field is authoritative.
|
||||
- Whether Stende and Zīlāni remain the production feeds after users test real provider data.
|
||||
- Confirm how Valmiera is named and sourced when authorized provider data is available.
|
||||
- Final pixel-level Monda export comparison against the production masters.
|
||||
- Apply the same native-resolution production comparison to additional broadcast products as they are finalized.
|
||||
- Required authentication and role separation for analytical, production, and administrative workspaces.
|
||||
|
||||
+5
-5
@@ -9,18 +9,18 @@ This directory contains the working documentation for the WeatherTool modernizat
|
||||
- Staging uses deterministic synthetic observations for the repository station set plus Valmiera, required by Faktiskā.
|
||||
- Scheduled external-provider jobs are disabled in development and staging.
|
||||
- PostgreSQL is private to the project Compose network; only the Scala application publishes a host port.
|
||||
- UI modernization is in progress. City Analysis retains custom analytical map outputs, while Faktiskā is a fixed 13-position, latest-temperature newsroom workflow with a locked 3840×1440 export.
|
||||
- The operator-facing workspaces now use the Latvian workflow names **Stacijas**, **Kartes**, **Faktiskā**, **Ūdens**, **Apskats**, **Arhīvs**, **Harmonie**, and **LVĢMC**. Kartes retains custom analytical map outputs, while Faktiskā is a fixed 13-position, latest-temperature newsroom workflow with a locked 3840×1440 export.
|
||||
- Faktiskā symbol placement is automatic after manual image selection and is anchored to each rendered temperature badge.
|
||||
- The first **Ūdens temperatūra** workspace is implemented with manual Latvian-named fields and required 1920×1080 and 3840×1440 exports; visual calibration remains in progress.
|
||||
- **Ūdens** uses separate authoritative 1920×1080 and 3840×1440 production templates. Its six value rectangles are measured per template and the text is optically centered from rendered glyph bounds; both exports have been visually validated.
|
||||
- Confirmed local Monda Regular/Bold files provide interface and generated-graphic typography; weather symbols use normalized transparent image assets.
|
||||
- Release `ef64895` was built from the exact committed Git tree, smoke-tested on Rocky, checksummed on both hosts, and deployed as the immutable full-SHA image `weathertool:ef6489549b990864c59a720f2ba5b25f5caaa4f1`. Release `16a8c68` remains the immediate application rollback image.
|
||||
- Release `df911f1` is deployed as immutable image `weathertool:df911f14eb8a1041822959677e09bb544ce0cdcd`; release `ef64895` remains the immediate application rollback. The next candidate adds explicit JSON API responses, Latvian workflow labels, and calibrated water-temperature exports.
|
||||
- The isolated VPS UAT stack is running and healthy: WeatherTool is bound to `127.0.0.1:8002`, Authelia to `127.0.0.1:9091`, and PostgreSQL has no host port. Public access is routed through Cloudflare, Nginx, and Authelia.
|
||||
- Cloudflare delegation is active, strict origin TLS covers only `laikapstak.li` and `auth.laikapstak.li`, and the public Nginx/Authelia login flow is operational without changing the existing HOP site.
|
||||
- The VPS database contains a deliberately limited 14-day, 34-city synthetic dataset for newsroom visual testing. It must be cleared before authorized real-provider ingestion begins.
|
||||
- Approved 1920×1080 and 3840×1440 PNG production bases are now the rendering source for Faktiskā and Ūdens temperatūra; code draws only the changing values, selected weather symbols, and wind data over those fixed newsroom graphics.
|
||||
- Browser branding assets and Latvian Open Graph/Twitter metadata are included for favicon, Apple home-screen icon, and link-preview support. Public crawler access still depends on the Nginx/Authelia policy used for the metadata and preview image.
|
||||
- Browser verification of release `16a8c68` confirmed both fixed-map workspaces and the favicon. The shared UAT login is ready for newsroom-user testing; equivalent visual verification of the dependency-maintenance release remains a UAT checkpoint.
|
||||
- Frontend dependency maintenance is complete through commit `de6f279`: Solid runtime and Vite tooling were updated, obsolete packages were removed, TypeScript checking was added, and a clean Rocky `npm ci`, typecheck, production build, full audit, and production-only audit all pass with zero known vulnerabilities. Documentation commit `ef64895` containing that reviewed dependency state is the current VPS release.
|
||||
- Browser verification is complete for the deployed `df911f1` release and for the later candidate changes on Rocky. The shared UAT login is ready for newsroom-user testing.
|
||||
- Frontend dependency maintenance is complete: Solid runtime and Vite tooling were updated, obsolete packages were removed, TypeScript checking was added, and a clean Rocky `npm ci`, typecheck, production build, full audit, and production-only audit all pass with zero known vulnerabilities.
|
||||
- This is not yet approved or hardened for workplace production.
|
||||
|
||||
## Documents
|
||||
|
||||
@@ -126,8 +126,8 @@ Status: pending
|
||||
- [x] Implement the fixed Faktiskā station set, latest-temperature loading, manual overrides, and locked 3840×1440 export.
|
||||
- [x] Make Faktiskā weather-symbol selection manual while keeping placement automatic and badge-relative.
|
||||
- [x] Replace Daira font glyphs with normalized 256×256 transparent image assets across the editor and canvas renderers.
|
||||
- [x] Add a separate Latvian-named Ūdens temperatūra workspace with fixed manual fields.
|
||||
- [ ] Validate independent Ūdens temperatūra exports at 1920×1080 and 3840×1440 against the production specification.
|
||||
- [x] Add a separate Latvian-named Ūdens workspace with fixed manual fields.
|
||||
- [x] Calibrate and visually validate independent Ūdens exports at 1920×1080 and 3840×1440 against the supplied production templates.
|
||||
- [x] Bundle the confirmed Monda Regular/Bold files and replace temporary Rubik rendering.
|
||||
- [ ] Perform pixel-level Monda comparison against the authoritative production masters.
|
||||
- [ ] Test target resolutions and real workplace display conditions.
|
||||
@@ -155,13 +155,13 @@ Status: in progress
|
||||
- [x] Provision a dedicated `/srv/weathertool` tree, Compose project, private network, database storage, and loopback-only application and Authelia ports.
|
||||
- [x] Configure Authelia with one temporary shared account, Argon2id password storage, rate limiting, and temporary IP bans.
|
||||
- [x] Add an exact-host Cloudflare origin certificate and Nginx authorization routing without disrupting the existing HOP site.
|
||||
- [x] Build and verify commit-addressed images on Rocky, transfer and checksum-verify them on the VPS, and update only the application service. Current full-SHA image: `weathertool:ef6489549b990864c59a720f2ba5b25f5caaa4f1`; PostgreSQL and Authelia were not restarted.
|
||||
- [x] Build and verify commit-addressed images on Rocky, transfer and checksum-verify them on the VPS, and update only the application service. Current full-SHA image: `weathertool:df911f14eb8a1041822959677e09bb544ce0cdcd`; PostgreSQL and Authelia were not restarted.
|
||||
- [ ] Complete UAT verification: public authentication and application health pass; direct-origin blocking, logout, throttling, PNG downloads, backups, logs, and rollback remain.
|
||||
- [ ] Run the month-long user test with manual releases and record feedback before any workplace-production decision.
|
||||
|
||||
## Known current limitations
|
||||
|
||||
- The fixed production PNG bases, browser/social metadata, and reviewed frontend dependency updates are deployed in UAT release `ef64895`; newsroom workflow validation is in progress.
|
||||
- The fixed production PNG bases, browser/social metadata, reviewed frontend dependency updates, stabilized header navigation, and authenticated API routing are deployed in UAT release `df911f1`; newsroom workflow validation is in progress.
|
||||
- Link-preview crawlers cannot authenticate through Authelia; the final Nginx policy must deliberately expose only the minimum preview metadata/assets if WhatsApp previews are required.
|
||||
|
||||
- Staging uses synthetic PostgreSQL station data.
|
||||
@@ -193,3 +193,8 @@ Record completed work here by date and commit after the Git workflow is establis
|
||||
| 2026-08-20 | `16a8c68` | Deploy approved production map bases, normalized branding assets, favicon, Apple icon, and social metadata to public UAT | Yes — Rocky build and VPS/browser smoke checks |
|
||||
| 2026-08-21 | `5007517`–`de6f279` | Update Solid runtime and frontend build tooling, add type checking, remove obsolete packages, prune the lockfile, and resolve all npm advisories | Yes — clean `npm ci`, typecheck, production build, full audit, and production-only audit |
|
||||
| 2026-08-22 | `ef64895` | Deploy the reviewed zero-advisory frontend dependency state as an immutable full-SHA VPS release while leaving PostgreSQL, Authelia, and HOP uninterrupted | Yes — isolated Rocky smoke test, dual-host checksum, matching image ID, container health, loopback, authentication-gate, and HOP checks |
|
||||
| 2026-08-22 | `36d094e` | Stabilize the header, keep the primary workspaces visible, and move secondary workspaces into an icon-labelled menu | Yes — Rocky browser and Jam navigation checks |
|
||||
| 2026-08-22 | `df911f1` | Preserve API 401 responses through Authelia/Nginx so frontend queries do not follow cross-origin login redirects | Yes — Rocky and VPS health checks; authenticated browser query verified after refreshing synthetic data |
|
||||
| 2026-08-22 | `f3197bf` | Return query API payloads with an explicit JSON content type | Yes — Rocky API and browser verification; VPS deployment pending |
|
||||
| 2026-08-22 | `0608865` | Localize the operator-facing workspace names and concise workflow copy in Latvian | Yes — Rocky browser verification; VPS deployment pending |
|
||||
| 2026-08-22 | `7f09181` | Independently calibrate both Ūdens templates and optically center Monda values using visible glyph bounds | Yes — both native-resolution PNG exports visually validated on Rocky; VPS deployment pending |
|
||||
|
||||
Reference in New Issue
Block a user