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
import mapping: no fieldMapping target can build a compound (address) value from separate CSV columns — a dotted target passes validate and dry-run, then fails every row on commit #20149
Ruled: 5852138019 · letter A · 2026-09-27T03:00Z
Blocked-by: #20150
Seam: spec ImportFieldMappingSchema.target (a declared part of a compound field, field.part) → runtime packages/restimport-mapping.tsapplyMappingToRows assembly, and the shared target door in objectstack validate / dryRun
Filing-gate category ① — reproducible platform defect/gap with a named landing (@objectstack/restimport-mapping.tsapplyMappingToRows), found by the repo:hotcrm seat while executing a maintainer ruling. Reader: objectstack triage → the lane that owns packages/rest import mapping (and packages/specdefineMapping if the fix is a new transform). Ruled A (comment 5852138019): a Seam: card in the spec lane, dispatched vertically once #20150 has landed. hotcrm#1836 waits on it with Blocked-by:.
Dedup (MCP search_issues, repo objectstack, open+closed): "import mapping fieldMapping target compound address field parts street city dotted target" → 0 hits; control "import mapping address expected object received string join transform" → 1 hit (#5137, unrelated), so the query reaches this area. Related, closed: #4633 (dry run did not pre-check a string aimed at an address field — a different defect).
What happens (measured on @objectstack/* 17.4.0, by the hotcrm#1836 dev, report hotcrm#1836 comment 5833767403)
A mapping can only write each CSV column to one flat key. Nothing can assemble street / city / state / postalCode / country columns into one Field.address() value.
fieldMapping targets mailing_address.street … mailing_address.country against the unchanged customer template (50 rows):
commit: ok 0, errors 50, every row INVALID_FIELD: Unknown field 'mailing_address.street' on object 'crm_contact'.
objectstack validate exits 0 with no diagnostic for a fieldMapping.target that names no field.
Mechanism (read in @objectstack/rest dist, src/import-mapping.tsapplyMappingToRows): every transform (none / lookup / constant / map / split / join) writes mapped[target] as a single flat key; coerceRow passes a key with no field metadata through untouched, so the engine receives a literal dotted key. join into the address field yields a string, which the engine rejects per row (Import dry run green-lights a row the write then rejects: structured value shapes (address / location) are not pre-checked #4633's message: expected object, received string).
Control: the engine itself accepts the compound value — a nested JSON row (mailing_address: { street, city, … }) imports 1/1 and reads back intact, and the 17.4.0 console renders it as one unit.
Why it matters
A structured address cannot be fed by a spreadsheet at all. hotcrm already paid for this twice: its account import template dropped its address columns for this reason (src/sales/mappings/account_import.mapping.ts:100-106), and the maintainer's 2026-09-18 ruling on hotcrm#1836 (convert the contact's five flat mailing_* fields to one Field.address(), "the customer's template does not change") cannot land.
The three observations, for triage to split or keep together
Capability: a way for a mapping to write into a compound field's parts (a dotted target resolved into a nested value, or a compose transform).
Ruled: 5852138019 · letter A · 2026-09-27T03:00Z
Blocked-by: #20150
Seam: spec
ImportFieldMappingSchema.target(a declared part of a compound field,field.part) → runtimepackages/restimport-mapping.tsapplyMappingToRowsassembly, and the shared target door inobjectstack validate/dryRunFiling-gate category ① — reproducible platform defect/gap with a named landing (
@objectstack/restimport-mapping.tsapplyMappingToRows), found by therepo:hotcrmseat while executing a maintainer ruling.Reader: objectstack triage → the lane that ownsRuled A (comment 5852138019): apackages/restimport mapping (andpackages/specdefineMappingif the fix is a new transform).Seam:card in the spec lane, dispatched vertically once #20150 has landed. hotcrm#1836 waits on it withBlocked-by:.Dedup (MCP
search_issues, repo objectstack, open+closed): "import mapping fieldMapping target compound address field parts street city dotted target" → 0 hits; control "import mapping address expected object received string join transform" → 1 hit (#5137, unrelated), so the query reaches this area. Related, closed: #4633 (dry run did not pre-check a string aimed at an address field — a different defect).What happens (measured on
@objectstack/*17.4.0, by the hotcrm#1836 dev, report hotcrm#1836 comment 5833767403)A mapping can only write each CSV column to one flat key. Nothing can assemble
street/city/state/postalCode/countrycolumns into oneField.address()value.fieldMappingtargetsmailing_address.street…mailing_address.countryagainst the unchanged customer template (50 rows):ok 0, errors 50, every rowINVALID_FIELD: Unknown field 'mailing_address.street' on object 'crm_contact'.ok 44— the dry run again promises what the commit refuses (Import dry run green-lights a row the write then rejects: structured value shapes (address / location) are not pre-checked #4633's contract: the dry run predicts the write).objectstack validateexits 0 with no diagnostic for afieldMapping.targetthat names no field.@objectstack/restdist,src/import-mapping.tsapplyMappingToRows): every transform (none/lookup/constant/map/split/join) writesmapped[target]as a single flat key;coerceRowpasses a key with no field metadata through untouched, so the engine receives a literal dotted key.joininto the address field yields a string, which the engine rejects per row (Import dry run green-lights a row the write then rejects: structured value shapes (address / location) are not pre-checked #4633's message: expected object, received string).mailing_address: { street, city, … }) imports 1/1 and reads back intact, and the 17.4.0 console renders it as one unit.Why it matters
A structured address cannot be fed by a spreadsheet at all. hotcrm already paid for this twice: its account import template dropped its address columns for this reason (
src/sales/mappings/account_import.mapping.ts:100-106), and the maintainer's 2026-09-18 ruling on hotcrm#1836 (convert the contact's five flatmailing_*fields to oneField.address(), "the customer's template does not change") cannot land.The three observations, for triage to split or keep together
validateaccepts afieldMapping.targetthat names no field on the object.