Skip to content

map view: plugin-map reads the deployment's default style (runtime-config mapStyleUrl) before falling back to demotiles (the ui half of #26001) #26163

Closed

Description

@objectstack-fleet

Blocked-by: #26001

Filed by the domain:server seat 1 (session_01R1q2xdtYgU6FKrZ7LgjPCC) as ruling 6413991421 on #26001 directs: "the holding domain:server seat files the domain:ui sub-card for the renderer seam with Blocked-by: this card". ⛔ Not a claim.

Origin: #26001 (letter A, operator env only), which carries item 2 of #25889. #25889 item 1 (the translated failure notice) belongs to the domain:ui seat and is a separate piece of work.

Server half (PR #26162, Fixes #26001): an operator sets OS_CONSOLE_MAP_STYLE_URL. GET /api/v1/runtime/config then serves it as the top-level field mapStyleUrl, which is absent when the env is unset. The value's origin joins the Console CSP connect-src at boot. demotiles.maplibre.org stays allow-listed.

What to build (ui/): ui/packages/plugin-map uses runtime-config mapStyleUrl as the map style fallback. The order is:

  1. the view's own mapStyle (schema.mapStyle || schema.map?.style);
  2. then mapStyleUrl;
  3. then DEFAULT_MAP_STYLE (demotiles).

plugin-map does not depend on app-shell, so it cannot call getRuntimeConfig() directly. It needs a seam, either a context or a prop the Console injects; the dev picks one and states it.

⛔ No new spec key and no Setup setting (ruling A).

Done when:

  • With the env set, a map view with no style of its own loads the operator's style.
  • With the env unset, it loads demotiles as before.
  • A view's own mapStyle still wins.
  • Each of these is pinned by a test.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · 2026-10-26T17:28Z
    Session: session_01SMps7wq7rBTk53e8KTSEup
    Account: os-steve
    Branch: claude/issue-26163-map-style-runtime-fallback
    Worktree: objectstack-issue-26163
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/plugin-map/src/ObjectMap.tsx (the style resolution around DEFAULT_MAP_STYLE :67 and :429) plus a small seam in plugin-map (a context or prop); the Console-side injection that reads runtime-config mapStyleUrl (app-shell or apps/console, wherever the runtime config is already read); tests beside each; root .changeset/; scripts/sdui-manifest.sources/plugin-map.json (re-record under the lock). ⛔ no new spec key, no Setup setting (ruling A on #26001); ⛔ ui/.github/**, root ci.yml.
    Container & model: M, mode:subagent, model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the map view's fallback style when a view declares none | GET /api/v1/runtime/config mapStyleUrl (#26001, served by #26162) | every map view on a deployment whose operator sets OS_CONSOLE_MAP_STYLE_URL
    Thread-read: none
    Premise: holds 2026-10-26T17:27Z. The blocker #26001's server half, PR #26162, is MERGED. On origin/main 81bba6c3, ObjectMap.tsx:67 hard-codes DEFAULT_MAP_STYLE (demotiles) as the only fallback after the view's declared mapStyle, and no ui/ code reads mapStyleUrl yet. plugin-map does not depend on app-shell, so it needs a seam.
    Serial constraints cleared: none. No open PR touches ui/packages/plugin-map/ or its sources record. #25889 (the previous ObjectMap card) is closed.
    Writes: PR only via the relay op pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26163,
      "status": "done",
      "branch": "claude/issue-26163-map-style-runtime-fallback",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26326",
      "head_sha": "3f5e3446dc1e1668536e28bc55c622a401d68fe8",
      "session": "session_01SMps7wq7rBTk53e8KTSEup",
      "premise_still_valid": true,
      "summary": "A map view with no style of its own now uses this order: the view's own mapStyle or map.style, then the deployment default (runtime-config mapStyleUrl, served by #26162 from OS_CONSOLE_MAP_STYLE_URL), then DEFAULT_MAP_STYLE (demotiles). The seam is a context, HostMapStyleProvider and useHostMapStyle, placed in @object-ui/react next to HostNavigationContext, not in plugin-map. The Console loads plugin-map lazily through registerLazy, so a provider imported from the plugin would pull maplibre-gl into every page, and a registry-rendered block cannot receive a prop. plugin-map's public exports are unchanged. app-shell reads mapStyleUrl into AppShellRuntimeConfig, re-read from each payload, and ConsoleShell supplies it. A failed deployment style now gets its own notice, element.map.styleFailedDeployment, in all ten packs. Without it, the default-style notice would blame public tiles that the map never drew.",
      "files_changed": [
        ".changeset/26163-map-style-runtime-fallback.md",
        "scripts/sdui-manifest.sources/i18n.json",
        "scripts/sdui-manifest.sources/plugin-map.json",
        "scripts/sdui-manifest.sources/react.json",
        "ui/content/docs/plugins/plugin-map.mdx",
        "ui/packages/app-shell/src/console/ConsoleShell.tsx",
        "ui/packages/app-shell/src/console/__tests__/ConsoleShell.mapStyle-26163.test.tsx",
        "ui/packages/app-shell/src/runtime-config.test.ts",
        "ui/packages/app-shell/src/runtime-config.ts",
        "ui/packages/i18n/src/locales/(ar,de,en,es,fr,ja,ko,pt,ru,zh).ts",
        "ui/packages/plugin-map/README.md",
        "ui/packages/plugin-map/src/ObjectMap.deploymentStyle-26163.test.tsx",
        "ui/packages/plugin-map/src/ObjectMap.tsx",
        "ui/packages/react/src/context/HostMapStyleContext.tsx",
        "ui/packages/react/src/context/index.ts"
      ],
      "line_budget": "24 files, +438 / -25 against the merge base, under the human-merge threshold of 3000",
      "tests": "run, all under os-verify-lock from cwd ui/. RED leg: ObjectMap.tsx restored in the working tree only to pre-change 10e80921, tests at HEAD: 3 failed / 62 passed (env set no view style x2, failed deployment style notice). Restore proven by HEAD blob hash match and an empty git diff HEAD. GREEN leg: Tests 65 passed (65). Ablation of the ConsoleShell injection (styleUrl replaced by undefined, injected=1 removed-left=0): 'hands the served mapStyleUrl to every renderer below it' went red, 1 failed / 1 passed, then restored by hash. Post-merge at 10e1f91a: vitest over plugin-map/, i18n/, react/src/context, ConsoleShell hostNavigation/mapStyle/notifications, runtime-config, ObjectView.mapFlatten, InterfaceListPage.mapConfig gave Test Files 149 passed (149), Tests 1862 passed, 13 skipped. type-check (tsc --noEmit plus tsconfig.test.json) for plugin-map, react, i18n and app-shell: each exit 0 with 0 TS errors, after turbo build --filter=@object-ui/app-shell^... (64/64).",
      "gates": "derived: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 3f5e3446 gave 45 commands. run: 44 exit 0. NOT-MEASURED: pnpm check:type-check-debt exit 3 (PREREQUISITE NOT MET; its closure build queue-timed out on the shared verify lock). The --ran reconciliation exited 0: '45 derived, 44 run, 1 NOT-MEASURED, 0 UNRUN'. The sdui record was re-recorded with node scripts/gen-sdui-manifest-node.mjs under the lock: i18n, plugin-map and react moved, and the artefact sha256 1f6e1ccb925a is unchanged. node scripts/check-sdui-manifest.mjs exits 0 at 3f5e3446. ui check:new-line-citations: 0 new. eslint on the changed files: 0 errors. CI: no check-runs had reported on 3f5e3446 when this report was written, so CI is in_progress / NOT-MEASURED. The derivation warns the tree is about 15 commits behind origin/main; main was merged twice, the second time at 10e1f91a, and the merge queue rebuilds on main.",
      "dogfood_battery": "n/a: no ! in the PR title and Clause-② has no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2: (1) fleet-write relay dispatch POST /repos/objectstack-ai/objectstack/dispatches running pr_create, which created PR #26326 as a draft with assignee os-steve; read back 6997 bytes sent and stored; (2) this os-dev-report comment, posted through post-stamped.mjs. git push is not counted.",
      "deviations": [
        "Scope: the seam lives in ui/packages/react (HostMapStyleContext.tsx plus an index.ts export), outside the claimed surface, which named a small seam in plugin-map. A plugin-map export would make the Console eagerly load the lazily registered plugin and maplibre-gl with it. scripts/sdui-manifest.sources/react.json and i18n.json therefore moved too.",
        "Scope: the i18n packs gained element.map.styleFailedDeployment. This is a defect the change itself would have created: without the key, a failed operator style would show the default-style notice, which blames public default tiles the map never drew.",
        "The red-first run did not cover runtime-config.test.ts or ConsoleShell.mapStyle-26163.test.tsx. Their implementation was committed before the lock freed. The ConsoleShell injection was proven by the ablation leg instead.",
        "An early red attempt was narrowed: it ran unlocked with maxWorkers=1 after two lock queue-timeouts. It failed on missing @objectstack dists rather than on behaviour, so that reading is void. The recorded red and green came from a later locked run.",
        "Not run locally: the full app-shell suite and the repo-wide pnpm lint. Both belong to CI."
      ],
      "open_questions": [
        {
          "question": "Should the object-map mapStyle input description, the @objectstack/spec row's verbatim describe 'overriding the public demo tiles', also name the deployment default?",
          "options": [
            "A leave it: the text is still true, and the spec is outside this card",
            "B a spec-side describe edit in a separate card"
          ],
          "recommendation": "A, because the describe is still accurate and changing it moves the spec contract text"
        }
      ],
      "out_of_scope_findings": [
        "carrier: none. Noted, not filed: docs/qa/platform-checklist/RUNNER.md records a historical QA reading that the map uses demotiles unless the view declares a style. It is pinned to its own run and left as is.",
        "carrier: none. Noted, not filed: the default-style notice still says 'set a map style for this view'. That remedy is valid, and OS_CONSOLE_MAP_STYLE_URL is now a second one."
      ]
    }
  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · seat 2 · 2026-10-27T05:01Z

    probe reading
    PR #26326 MERGED 2026-10-27T04:30Z, merge commit 9f16f16f, head 4d29020b (+435/−22, seat record on #26326)
    origin/main contains it (git merge-base --is-ancestor exit 0)
    queue branch gh-readonly-queue/main/pr-26326-*: none left (consumed)
    card closed (completed) by Fixes #26163 on #26326

    Status: a map view with no style of its own now draws the deployment's default style (OS_CONSOLE_MAP_STYLE_URL, served as runtime-config mapStyleUrl) before falling back to the public demo tiles. When that style fails to load, the message names the deployment default. pm:dispatched removed.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions