Skip to content

map view: the tile style is hard-wired to demotiles.maplibre.org, so an intranet or proxied deployment gets a grey canvas and an English "Map failed to load … configure a custom map style for production use" with nowhere to configure it #25889

Closed

Description

@os-steve

Filing gate ① a user-visible defect with a named landing site (the message itself says production needs a setting that does not exist). Batch-of: 2026-10-25 browser pass on @objectstack/* 18.1.0 (23 cards: hotcrm 10, objectui 10, objectstack 3). Filed by the maintainer's account (os-steve) from the HotCRM pass driven in session session_01AwpXhq2nFKU6J7GmbCEmZu; ⛔ not a claim. Grade and routing are objectui triage's; the setting half may be an objectstack Setup card.

What is seen (@objectstack/console 18.1.0, outbound network blocked)

HotCRM → 客户 → 客户地图: the markers render on a grey canvas; above it, in English on a zh-CN console:

Map failed to load (AJAXError: Failed to fetch (0): https://demotiles.maplibre.org/style.json). Markers below are still listed in the search box; configure a custom map style for production use.

plus 「1 record with missing or invalid coordinates excluded from the map.」, also English. 92-account-map.png.

reach: the public UI, measured once; every deployment without public internet, and every one whose policy forbids a third-party tile host, meets it.

Expected

  • A deployment-level map style setting (Setup → 配置, next to File Storage / AI), read by the map renderer; the demotiles URL stays the development default.
  • When the style fails to load, the view degrades to the marker list with a translated one-line message, and the two notices go through the bundle.

Dedupe

MCP search_issues objectui "map view tiles demotiles maplibre style configurable offline failed to load" → 2 hits: objectstack-ai/objectui#11819 (closed, WebGL2 crash instead of the fallback) and objectstack-ai/objectui#3297 (closed, worker 404); neither adds a style setting or translates the notices. Report: REPORT.md §3.11.

Activity

  1. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    and removed on Oct 25, 2026
  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — bug · priority:p2 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T13:00Z

    ⛔ Not a claim, ⛔ not a dispatch. finding comes off.

    • The tile style should come from configuration, with a translated failure message. If that needs a new settings or spec key, the key is a separate objectstack domain:spec card filed first.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Transferred 2026-10-26T02:50Z from objectstack-ai/objectui#13525, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.

    Paths. The body names no file paths; the UI code it describes lives under ui/ here (the Console is ui/apps/console, the libraries ui/packages/*).

    References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#3297, objectstack-ai/objectui#11819.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1 · 2026-10-26T08:33Z
    Session: session_01SMps7wq7rBTk53e8KTSEup (the seat; the card thread that implements it works on the branch below)
    Account: os-steve
    Branch: claude/project-thread-tvk6g5 (platform-assigned card-thread branch; a card thread can push only its assigned branch and the name carries no card number, so this claim is the identity record)
    Worktree: objectstack-project-thread-tvk6g5
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/plugin-map/src/ObjectMap.tsx (the style-failure alert, the invalid-coordinate notice, the mapStyleError state and the WebGL2 marker-list fallback it reuses) and plugin-map tests; ui/packages/i18n/src/locales/*.ts (append new element.map.* keys only); scripts/sdui-manifest.record.json (re-record); root .changeset/25889-map-style-failure-notice.md (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word).
    Container & model: M, mode:thread, model: default tier (dispatch-gates --tier --repo objectstack-ai/objectstack: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the map renderer's own hard-coded English notices and its alert-over-map failure mode | the per-view mapStyle exists; no deployment-wide default | every deployment without public internet, through the public UI
    Thread-read: 6407136555
    Premise: corrected 2026-10-26T08:25Z — item 1 (translated notice, degrade to the marker list) holds on origin/main 05f7758f05; item 2 (a deployment-wide style setting) needs a new settings/runtime-config key and a Console CSP change, so it is split to #26001 and this claim is item 1 only: the PR body line 1 is Part of #25889
    Serial constraints cleared: ui/packages/i18n/src/locales/*.ts — seat 1's #25916 and #25898 append keys there in parallel; append-only here too, the later lander merges main. No claim holds ObjectMap.tsx.
    Writes: PR only via the relay op pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 25889,
      "status": "done",
      "branch": "claude/project-thread-tvk6g5",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26048",
      "session": "session_01HUu4jGnAzZqaB5qTG2fsX4",
      "premise_still_valid": true,
      "summary": "Item 1 only (Part of #25889; item 2 is #26001). Measured on 05f7758f: a MapLibre error event kept MapGL mounted with an English alert claiming the markers were listed in the search box and asking for a production style setting that does not exist. Now the error unmounts MapGL and renders the existing WebGL2 record list (testid map-style-fallback, searchable, rows take the marker click path) with a retry button; the alert keeps MapLibre's reason and names a real remedy (check this view's style URL, or ask an administrator to set a map style for this view). The style alerts, WebGL2 alert, list label and empty text, retry button and the excluded-coordinates count go through useObjectTranslation with inline en defaults; eight element.map keys appended to all ten packs, the count written Label: N so no plural family.",
      "tests": "At head 79dcecfd (main merged at 39a78b15, manifest re-recorded after): vitest packages/plugin-map/ + packages/i18n/ under the lock, Test Files 129 passed (129), Tests 1627 passed, 13 skipped; plugin-map alone at f4d90cad 42 files / 274 tests. New: ObjectMap.styleFailureList-25889.test.tsx (9 cases incl. map removed exactly once, retry remounts, unmount after the swap removes nothing twice and reaches no error boundary) and ObjectMap.noticesI18n-25889.test.tsx (real I18nProvider zh-CN). Flipped webgl2Controls-11819 style case; webgl2Fallback-11819 gains no-retry. Reverse run at f4d90cad with the base ObjectMap.tsx restored under a trap (restore proven by blob hash): 3 files red, 11 failed / 2 passed. type-check plugin-map and i18n: 0 errors, both new test files in the test program (--listFiles). NOT MEASURED: a real started MapLibre map removed after a style failure in a browser (happy-dom has no WebGL2; the stub cleanup stands in).",
      "gates": "Local at 79dcecfd: dispatch-gates --commands derived 46 families, each run with exit captured before any pipe, all exit 0; --ran reconciliation: 46 derived, 46 run, 0 NOT-MEASURED (derived zero). ui scripts check-i18n-call-site-keys, check-i18n-en-drift, check-i18n-dead-keys: exit 0. node scripts/check-sdui-manifest.mjs: exit 0 after re-record. eslint over touched files: 0 errors (pre-existing warnings only). PR check-runs: in_progress at report time, not awaited.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub calls",
      "api_writes": "2 — relay pr_create (POST pulls + POST issues/26048/assignees, one relay action) and this os-dev-report comment via post-stamped (POST issues/25889/comments); git push is not a REST write",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — the same map view still renders English literals: search placeholder, Loading map..., geolocation button label and its two error strings, popup Edit/Delete, mobile sheet labels, overlay title Location Details (listed in the PR Acceptance notes)",
        "carrier: seat 2 · file surface: ui/packages/i18n/src/__tests__/ariaLabelLiteralCensus-12145.test.ts was edited outside the claim's declared surface — a one-word deletion (Locations) the frozen backlog census requires in the commit that translates that aria-label"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Surface amendment · domain:ui seat 2 · 2026-10-26T10:16Z
    Session: session_01SMps7wq7rBTk53e8KTSEup
    Seat: domain:ui#2
    Branch: claude/project-thread-tvk6g5
    Amends: Claim 6411675493

    File surface (added): ui/packages/i18n/src/__tests__/ariaLabelLiteralCensus-12145.test.ts, a one-word deletion only (Locations leaves the plugin-map row of the frozen literal-aria-label backlog). The census forces it in the same commit that translates that label, which this card does. Four checks pass: it is the same defect class (an untranslated literal), the change is mechanical, no other claim holds the file, and it belongs to the same i18n gate family.

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Pointer · domain:ui seat 2 · 2026-10-26T10:17Z

    Item 1: ACCEPT → PR #26048 comment 6413581466 (head 79dcecfd). The seat lands it once the checks are green. Item 2 is #26001.

  8. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Landed · seat 2 · 2026-10-26T16:53Z

    probe reading
    PR #26158 (seat 1's i18n batch) MERGED 2026-10-26T16:46Z, merge commit 326a5593. It carries #26048 (Part of #25889, head 79dcecfd) verbatim, with seat 2's ACCEPT
    origin/main at 6862ef62, contains 326a5593 (git merge-base --is-ancestor exit 0)
    queue branch gh-readonly-queue/main/pr-26158-*: 0 left
    #26048 closed unmerged as superseded

    Status: item 1 (translated failure notice, degrade to the marker list) is done. Item 2 (a deployment-wide style setting) was split to #26001, which carries it from here. Closing as completed; pm:dispatched comes off.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uipriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions