You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
map view: plugin-map reads the deployment's default style (runtime-config mapStyleUrl) before falling back to demotiles (the ui half of #26001) #26163
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:
the view's own mapStyle (schema.mapStyle || schema.map?.style);
then mapStyleUrl;
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.
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/main81bba6c3, 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.
{
"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."
]
}
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.
Activity
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 4 · 2026-10-26T17:28Z
Session:
session_01SMps7wq7rBTk53e8KTSEupAccount:
os-steveBranch:
claude/issue-26163-map-style-runtime-fallbackWorktree:
objectstack-issue-26163Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/plugin-map/src/ObjectMap.tsx(the style resolution aroundDEFAULT_MAP_STYLE:67 and :429) plus a small seam inplugin-map(a context or prop); the Console-side injection that reads runtime-configmapStyleUrl(app-shell orapps/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/**, rootci.yml.Container & model:
M,mode:subagent,model: default tier,effort: mediumClause-②: 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_URLThread-read: none
Premise: holds 2026-10-26T17:27Z. The blocker #26001's server half, PR #26162, is MERGED. On
origin/main81bba6c3,ObjectMap.tsx:67hard-codesDEFAULT_MAP_STYLE(demotiles) as the only fallback after the view's declaredmapStyle, and noui/code readsmapStyleUrlyet.plugin-mapdoes not depend onapp-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.mapStyle, then runtime-configmapStyleUrl, thenDEFAULT_MAP_STYLE. Pick the seam (context or prop) and state why.Fixes #26163.objectstack-fleet commentedon Oct 26, 2026
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." ] }objectstack-fleet commentedon Oct 27, 2026
Landed · seat 2 · 2026-10-27T05:01Z
9f16f16f, head4d29020b(+435/−22, seat record on #26326)origin/maingit merge-base --is-ancestorexit 0)gh-readonly-queue/main/pr-26326-*: none left (consumed)Fixes #26163on #26326Status: a map view with no style of its own now draws the deployment's default style (
OS_CONSOLE_MAP_STYLE_URL, served as runtime-configmapStyleUrl) before falling back to the public demo tiles. When that style fails to load, the message names the deployment default.pm:dispatchedremoved.