Skip to content

Commit 88c30af

Browse files
huangyiireneclaude
andauthored
docs(skills): objectstack-upgrade factual sweep — 5 false facts corrected (#13861)
Flight ⑨ of the published-skills factual sweep (#13658). Five behavioral claims verified FALSE against the implementation and corrected in place; net -3 lines, token-neutral at the ratchet ceiling. Claude-Session: https://claude.ai/code/session_01EnE7G31tqbxN1rqpQmzurT Co-authored-by: Claude <noreply@anthropic.com>
1 parent 05ef23e commit 88c30af

1 file changed

Lines changed: 15 additions & 18 deletions

File tree

skills/objectstack-upgrade/SKILL.md

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ Everything below is the long form of those four steps.
105105
`--from` is the protocol major the metadata was **authored** against, not the
106106
one installed. Three sources, in order of authority:
107107

108-
1. **`manifest.protocol`** in the stack config (`'16.0.0'``--from 16`). This
109-
is the declared answer and the kernel checks it at load time.
108+
1. **`manifest.engines.protocol`** in the stack config (`'16.0.0'` → `--from
109+
16`). The declared answer, checked by the boot handshake.
110110
2. **The last `@objectstack/spec` major the project ever installed** — read the
111111
lockfile history (`git log -p pnpm-lock.yaml | grep -m5 '@objectstack/spec'`)
112112
when the manifest is absent or stale.
113113
3. **Ask.** A manifest that says 16 on a project last touched two years ago is a
114-
claim, not a measurement. If (1) and (2) disagree, the lower one is the safe
115-
`--from` the chain is idempotent, so replaying a hop that has already been
116-
applied is a no-op, while skipping a hop loses its rewrites.
114+
claim, not a measurement. If (1) and (2) disagree, settle it — ⛔ never
115+
default to the lower one: a default flip ([3.3](#33-validate)) stamps its
116+
constraint onto a source already past that major.
117117

118118
Arriving several majors late is the designed-for case. `os migrate meta --from 10`
119119
replays every step in order; there is no penalty for lateness and no requirement
@@ -296,24 +296,21 @@ The shape in a protocol-16 project:
296296

297297
The chain deletes the key (`field-mapping-transform-removed`) and the schema
298298
tombstones it, so the parse error *is* the prescription: the union had five
299-
members and **no runtime ever executed any of them**, so nothing is lost by
300-
deleting the key — but the customer wrote it because they wanted a
301-
transformation, and that need is real even though the key never served it.
299+
members and **no runtime ever executed any of them**. The customer wrote it
300+
because they wanted a transformation, and that need is real regardless.
302301

303-
The prescription names two live targets, and choosing between them is the
304-
business decision:
302+
The prescription names one live target; the rest is the business decision:
305303

306304
| If the intent was… | The v17 home is… |
307305
|:--|:--|
308-
| per-row value shaping on an import | **Import mapping** `mapping.fieldMapping[].transform` — a flat string enum (`none`/`constant`/`map`/`split`/`join`/`lookup`) with settings in `params`, executed row by row by the REST import path. |
309-
| multi-source, multi-stage transformation | an **ETL transformation step**. |
306+
| per-row value shaping on an import | **Import mapping** `mapping.fieldMapping[].transform` — a string enum, settings in `params`; the REST import path runs `none`/`constant`/`map`/`split`/`join`, passes `lookup` to reference resolution, rejects `javascript` (400). |
307+
| multi-source, multi-stage transformation | **nothing** — the L2 ETL layer retired at 17, unexecuted. Do it where it runs: warehouse ELT, a `flow`, a job. |
310308
| nothing — the value was already correct | delete the key and record that the transformation never ran. |
311309

312-
That third row is not a joke and it is frequently the truth: the member never
313-
executed, so the connector has been landing raw values for as long as it has
314-
been running. Whether the downstream data is therefore wrong is a question only
315-
the owner can answer, and it is exactly the kind of finding the report exists to
316-
surface.
310+
That third row is frequently the truth: the member never executed, so the
311+
connector has been landing raw values for as long as it has been running.
312+
Whether the downstream data is wrong is a question only the owner can answer —
313+
exactly the kind of finding the report exists to surface.
317314

318315
<a id="decide-alone-or-ask"></a>
319316

@@ -533,7 +530,7 @@ you must say which you expect:
533530
invalid_type: `FieldMapping.transform` … was removed in @objectstack/spec
534531
17.0.0 (ADR-0049) … Delete the key. The transform pipeline that IS
535532
enforced is the import mapping's … Run `os migrate meta --from 16` to
536-
rewrite it automatically.
533+
list the mechanical edits for existing sources; apply them by hand.
537534
expected: never
538535
```
539536

0 commit comments

Comments
 (0)