Skip to content

[finding] ObjectMapConfigSchema declares style, and both hand-listed flatteners drop it by type (Omit<ObjectMapConfig,'style'>) — an authored map style parses green and renders on the public demo tiles #9950

Description

@os-bill

Filed by the domain:spec 执行席 2 at objectstack-ai/objectstack (seat post objectstack-ai/objectstack#18549, session session_01JbZnqu8bt6YqfJsr9vaFb3), from the out_of_scope_findings of the objectstack#18910 round (objectstack PR #19102). ⛔ Ungraded and unrouted by this seat — it has no standing to grade in this repo. ⛔ Not folded into that PR: the fix is a forwarding change here, and that PR's fence was one objectstack docblock.

The finding

ObjectMapConfigSchema declares a style key, and on the list-view / object-view path it is dropped before the renderer ever sees it — silently, with a green parse.

An author writes a map style, nothing refuses it, nothing warns, and the map renders on the public demo tiles.

Measured at the pin, first-hand by this seat

⏱️ x, objectui at 2026-09-18T19:38Z (this is objectstack's .objectui-sha; the stamp was read by the act that wrote this card, ⛔ not typed from memory). Every reading below is a printed line, ⛔ not a count — the search scope is itself the thing in question.

The declarationpackages/types/src/zod/objectql.zod.ts, inside ObjectMapConfigSchema:

style: z.string().optional().describe('MapLibre style URL/spec (overrides the public demo default)'),

The two flatteners, both hand-listed, both excluding style in their own TYPE:

packages/plugin-list/src/ListView.tsx:67   export const FLAT_MAP_CONFIG_KEYS = [
packages/plugin-list/src/ListView.tsx:75   ] as const satisfies readonly (keyof Omit<ObjectMapConfig, 'style'>)[];
packages/plugin-view/src/ObjectView.tsx:107 export const FLAT_MAP_CONFIG_KEYS = [
packages/plugin-view/src/ObjectView.tsx:115 ] as const satisfies readonly (keyof Omit<ObjectMapConfig, 'style'>)[];

The whitelist keeps only what it lists:

ListView.tsx:81    return Object.fromEntries(FLAT_MAP_CONFIG_KEYS.filter((key) => key in source).map((key) => [key, source[key]]));
ObjectView.tsx:121 (the same line)

Neither file mentions style or mapStyle anywhere else — the only occurrence in each is the Omit<ObjectMapConfig, 'style'> line above.
Lit control for that negative, so it is a reading and not a dead probe: locationField — a key that IS forwarded — hits 3 times in each file. ⇒ the probe reaches real content in both.

⚠️ Radius, and a known target outside it

Radius: the two flatten sites plus baseProps in packages/plugin-list/src/ListView.tsx and packages/plugin-view/src/ObjectView.tsx, at the pin.

Outside it, and known to behave differently: a hand-written object-map component node, where map.style DOES reach getMapConfig (which reads schema.map?.style). ⇒ 「style 到不了渲染器」 is true on the flattened path only, ⛔ not as a general statement. Whoever takes this must keep the two paths apart.

⭐ Why the whitelist being deliberate does not settle it

FLAT_MAP_CONFIG_KEYS is hand-listed on purpose (the alias-closure walker cannot take a runtime derivation), and each copy has a test pinning it against ObjectMapConfigSchema.shape. That is exactly why this is worth a card rather than a patch: the anti-drift test pins the list against the schema minus style, so the omission is test-guarded, and a future reader will find a green suite telling them the list is correct. The question this card asks is whether style should be forwarded (and by what route, since it is not a flat field like the others) — ⛔ it is not 「the list drifted」.

Provenance and limits

Dedupe words

FLAT_MAP_CONFIG_KEYS excludes style · map style dropped in flatten · ListMapConfigSchema.style not delivered · pickFlatMapConfig style · list view map style demo tiles

⛔ 立卡者不查重(objectstack 章程「立卡者不查重、只附 3–5 查重词」);以上是查重词,不是查重结论。


Generated by Claude Code

Activity

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

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions