Uh oh!
There was an error while loading. Please reload this page.
spec(data): retire the import mapping lookup transform's steering params (#10329, ADR-0049) - #11280
Conversation
…ams (#10329, ADR-0049) Strict-delete ImportFieldMappingSchema.params' object/fromField/toField/ autoCreate — declared to steer the lookup transform, read by nothing: lookup copies the cell through and reference resolution runs off the target field's own metadata. All fifteen spellings (four canonical + eleven ex-aliases) land on guidance prescriptions; D2 conversion mapping-lookup-params-removed (protocol 18) strips the keys from stored sources; liveness sub-walk note records the retirement; docs warning deleted; changeset with FROM->TO. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RadETjNRLALFLhFA3xehZP
📓 Docs Drift CheckThis PR changes 1 package(s): 17 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 3 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 56dffce3d7c625c473d07b8aaa4968c8dc84dd8a && git checkout 56dffce3d7c625c473d07b8aaa4968c8dc84dd8a
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 050d8d8685312ee6a0a77bd9036becf30750fd31 ea258bef9fdea9fa52d0f650b0edbfa0052cda44 && git checkout -B drift-repro 050d8d8685312ee6a0a77bd9036becf30750fd31 && git merge --no-ff ea258bef9fdea9fa52d0f650b0edbfa0052cda44
node scripts/docs-audit/affected-docs.mjs --json 050d8d8685312ee6a0a77bd9036becf30750fd31
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32629757073 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
os-sam
commented
Aug 23, 2026
Queue-kick triage (spec seat, Verdict: infra, not this PR — re-queue once, deliberately delayed. The two failed queue jobs both died at the Disposition: this is the died-before-any-test-body re-run case. To avoid burning another full-queue build into the same blip, the re-queue happens on the seat's next patrol (~09:20Z) rather than immediately — one re-queue, and a second failure of any shape is treated as real. No changes will be pushed for this signature. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#10329
Implements the triage ruling (comment 5383458820): option 1 — retire the four inert
lookupparams (object,fromField,toField,autoCreate) fromImportFieldMappingSchema.paramsunder ADR-0049 enforce-or-remove, with every alias spelling converted toguidanceso each of the fifteen spellings lands on a prescription. Option 2 (a second reference-resolution dialect inapplyMappingToRows) is not implemented, per the ruling.Premise re-verification (on
origin/mainat064d484bd, pre-fix)packages/spec/src/data/mapping.zod.ts(shape lines 165–168; aliases foldinglookupObject/targetObject,match/matchOn/matchField/keyField,returnField/valueField,create/createIfMissing/upsertonto them).applyMappingToRowsstill handleslookupin the same branch asnone(packages/rest/src/import-mapping.ts:122-127— the cell is copied through; the comment defers resolution to the pipeline's metaMap).mapping.jsonsub-walk boundary note still recorded the four keys as read by nothing.fromField/autoCreate/ the alias spellings outsidemapping.zod.ts+ its tests returned only unrelated identifiers (sql-driver.tsuniqueIndexesFromFields,tenant.zod.tsautoCreateSchema/autoCreateDatabase,field.zod.ts's ownlookupObject → referencealias). Positive control: the same grep instrument finds the real reader of the neighbouringparams.valueMapatpackages/rest/src/import-mapping.ts:134-136.premise_still_valid: true.What changed
packages/spec/src/data/mapping.zod.ts): the four keys are strict-deleted from theparamsshape (paramsis astrictObject, so this is the guidance-map route, notretiredKey()— the 17.0.0 #4488 审计发现的四个"授权门断连":email_template / job / validation 的元数据条目到不了执行点,action 导航项点不动 #4509 treatment ofextractQuery/errorPolicy/batchSizeon this same schema, one level down).PARAMS_RETIRED_KEY_GUIDANCEcarries fifteen entries — 4 canonical + 11 ex-alias spellings — each landing on a full prescription (fully-qualified key, why it was inert, the imperative fix, theos migrate meta --from 17sentence). Per the ruling, theautoCreateguidance says what actually happens: nothing was ever created — an unresolved reference fails the row withimport_reference_not_found, with or without the key.mapping-lookup-params-removed(protocol 18,retiredFromLoadPath: true) strips the four keys from storedmappings[].fieldMapping[].params(pure lossless deletes; drilled two levels down, themetric-filters-removedshape one level deeper; fixtureexpectedNotices: 4). Wired into the step-18 chain (conversionIds+ rationale extended).RETIRED_KEYS_BY_MAJORentries — deliberately. These keys sit one sub-walk level below the authorable-surface drill:authorable-surface/data.jsonrecordsdata/ImportFieldMapping:paramsonly (that row stays live), so there is nodefKey:namerow for the four to register, delete, or age out — gates (a)/(b)/(b2)/(c) never see them. This mirrors howextractQuery/errorPolicy/batchSizeleft this same schema at 17.0.0 (conversion + guidance, no retired-key table entries). The dispatch's "retired-key entries" default yields to the playbook's route table and this file's own precedent, as instructed.packages/spec/liveness/mapping.json): thefieldMappingsub-walk boundary note now records the retirement (strict deletion — nothing dead remains below the drill) instead of parking the finding. Entry stayslive; no row deletion (the four never had rows — sub-walk).import-mappings.mdxparams warning (the callout pointing at spec(data): mappinglookuptransform params (object / fromField / toField / autoCreate) are authorable and read by nothing #10329) is deleted — that page's SDK warning is untouched (a batch sibling owns it).content/docs/references/data/mapping.mdxregenerated: theparamsrow now lists onlyvalue/valueMap/separator.mapping.test.ts): refusal pins per key asserting the prescription text (theautoCreatepin asserts "nothing was ever created" +import_reference_not_found), alias-routing pins, and a surviving-surface pin. The old accept-lookup-params tests are replaced..changeset/mapping-lookup-params-removed.md:minorper the lockstep launch-window convention (post-17.0.0-cut, prescription registered at protocol 18 — theelement-form-retiredprecedent;check-changeset-no-majorgreen confirms the convention), FROM → TO per key, one-line fix, plus the adr-0087registered mapping-lookup-params-removedmarker.packages/rest/src/import-mapping.ts(the pass-through stays; its comments never named the four keys, so no comment edit either),content/docs/releases/,skills/**(no diff — the two skill readings are therefore not applicable).Note:
spec-changes.json/ the upgrade guide deliberately do not change —PROTOCOL_MAJORis 17 and the generator folds up to the current major only; the protocol-18 conversions (this one and its step-18 siblings, e.g.metric-filters-removed) enter those artifacts when 18 is cut.check:spec-changes/check:upgrade-guidegreen.Reverse verification (from the committed state)
Predicted direction stated before the run: restoring the pre-fix
mapping.zod.tsfrom base064d484bdmust turn the five new refusal/alias pins RED (the keys parse cleanly again, so the expected throws never happen) and leave the surviving-surface pins green. Mutation proven on disk before reading results (grep -c 'autoCreate: z.boolean().optional()'= 1,grep -c PARAMS_RETIRED_KEY_GUIDANCE= 0). Observed: exactly 5 failed / 33 passed. No rebuild leg needed —mapping.test.tsimports./mapping.zodrelatively (src, never through the packageexports/dist), so the mutated source is the resolved module by construction. Restore leg:git checkout HEAD -- …, restoration proven on disk (greps invert: 3 / 0), re-run 38/38 green,git statusclean.Verification (all at commit
ea258bef9, the head this PR ships; exit codes captured before any pipe, verdicts quoted from the runners' own lines)pnpm --filter @objectstack/spec build—os-verify-lock: VERDICT command-exit 0pnpm --filter @objectstack/spec check:generated— after--fixregenerated the one proved-stale artifact (gen:docs): all runnable gates green (check:authorable-surface✓ — zero surface change, correct for a sub-walk deletion;check:migration-registry✓;check:spec-changes✓;check:upgrade-guide✓)pnpm --filter @objectstack/spec test—Test Files 418 passed (418) · Tests 11118 passed (11118), VERDICT command-exit 0pnpm --filter @objectstack/rest test(after building the rest dependency closure) —Test Files 138 passed (138) · Tests 2201 passed (2201), VERDICT command-exit 0pnpm --filter @objectstack/spec typecheck/pnpm --filter @objectstack/rest typecheck— VERDICT command-exit 0 bothnode scripts/pm/dispatch-gates.mjs(no paths — the script derived the changeset itself; its stderr attributes the answer toobjectstack-ai/objectstackatea258bef9): 31 path-matched + 6 convention-triggered families derived. All 36 runnable local families run individually with captured exit codes:check-dev-prereqsfailed locally only on the fresh-worktree precondition "the workspace is not built" (43 packages without dist — an environment fact, not a diff finding; CI builds fresh); afterturbo run build --filter=./packages/* --filter=./packages/*/*it passes (exit 0), making it 36/36 PASScheck:query-options-erasure,check:type-check-coverage,check:engine-double-contract,check:where-matcher,check:cross-package-test-inputs— PASS;check:type-check-debt(self-test +--re-measure) run after the full packages-closure build — exit 0, PASSpnpm check:nul-bytes— PASSCI convergence is reviewed by the PM after this report, per the standing dispatch contract.
Generated by Claude Code