Repository navigation
test(cli): migrate-meta e2e replays only the conversions step 17 still registers - #27132
Conversation
…l registers #26599 aged the protocol-16.x conversions out of step 17, so `os migrate meta --from 16` no longer rewrites the fixture's action/flow/view/dashboard/ agent/skill/tool/rls shapes and the snapshot kept them as unknown keys. The fixture drops those shapes and carries one per conversion step 17 still registers (pinned equal to MIGRATIONS_BY_MAJOR[17].conversionIds), and the retired-key case re-points to tombstones that still stand (agent.lifecycle, dashboard.refreshInterval). Claude-Session: https://claude.ai/code/session_01QSeKYnN7X5PL1HWYjGfKJY Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…tree-absence pin agent.lifecycle's retirement pins the key absent from the tree outside its kit, so authoring it in this fixture redded spec's test:repo. The #9418 fixture now carries `structuredOutput.format: 'regex'` inside defineAgent (agent-structured-output-refused-members-removed, protocol 18) beside the Dashboard.create refreshInterval tombstone. Claude-Session: https://claude.ai/code/session_01QSeKYnN7X5PL1HWYjGfKJY Co-authored-by: Claude <noreply@anthropic.com>
席位核对 — ACCEPT · domain:devx#2 · head
|
Part of #27114
Clause-②: no
Metadata-protocol: none
维护者速读
packages/cli/test/migrate-meta.e2e.test.ts这一个夜间 e2e 测试文件。fixture 换成第 17 步仍注册的 12 个 conversion 各一处写法;os migrate meta --from <N>cannot load the retired-key sources it exists to fix — validates through the post-retirement schema before converting #9418 那组用例改用仍会被拒并被转换的退役写法:structuredOutput.format: 'regex'(agent-structured-output-refused-members-removed)和dashboard.refreshInterval;不用agent.lifecycle,因为它的退役测试钉死该键在全树不得出现。--from 16不再改写这些写法,快照里留下未知键,夜间 tiers 因此 6 个用例变红;PR 和合并队列不跑 e2e 层,所以只在夜间暴露。PRE17_CONFIG和EXPECTED_CONVERSIONS;② 新增的注册表钉子(EXPECTED_CONVERSIONS必须等于MIGRATIONS_BY_MAJOR[17].conversionIds);③os migrate meta --from <N>cannot load the retired-key sources it exists to fix — validates through the post-retirement schema before converting #9418 那组的 fixture 和os validate断言。OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run test/migrate-meta.e2e.test.ts,预期 19 个全部通过。What changes
#26599 (
dbf7e04adf, ruling 6434038284 on #25767) removed the 45 conversions retired at 16.1.0 from step 17'sconversionIds. It re-pointed the unit-tier cli pins but not this file, which runs only underOS_TEST_TIERS=nightly. The 2026-10-28 nightly (run 40638682260) went red on six of its cases.All six failures come from that narrowing:
--from 16leaves those shapes as written. So the run attributes nothing to them, and the snapshot keepsresponsive,performance,ariaanddefaultSortas unknown keys. That breaksschemaValid, the per-family attribution, the--outre-parse and idempotence.os migrate meta --from <N>cannot load the retired-key sources it exists to fix — validates through the post-retirement schema before converting #9418 fixture carriedagent.knowledgeandskill.triggerPhrases. Their tombstones and conversions left the spec with the 16.x kits, so the load no longer converts them, andos validateanswers with the strict unknown-key refusal that names the protocol upgrade guide, not the retired-key prescription.The fix is in this one file. No case is added, removed, renamed or skipped, so the count stays at 19.
full→editrename, the seven flow-node aliases and lifts (crudobject, notify, wait, connector, map, subflow, script),mongo→mongodb, the converged retry policy (retryDelayMs→backoffMs), the page-headerdescription→subtitlealias and the inline api action's object-formparams→bodyExtra. The list was read fromregistry.ts.templatestep 17, not from memory, and every id was checked againstconversions/registry.ts. Therequired/ no-storageassertions (ADR-0087'sfield-required-notnull-explicitconversion asserts an implication ADR-0113 abolished — the boot calls it a forward conversion, but its output and the source it prescribes disagree at the storage layer #16693), the canonicaldelete_recordpass-through and the flow errorHandling.maxRetries 有两个默认值:schema 声明 0、引擎回退 3 —— 重试次数取决于流程有没有过 schema #4247maxRetriesTODO stay.EXPECTED_CONVERSIONSequalsMIGRATIONS_BY_MAJOR[17].conversionIds(imported from@objectstack/spec/migrations, asmigrate-meta-default-range-window.test.tsdoes). The next family that leaves or joins the step then reds here by name, not as a missing rewrite.os migrate meta --from <N>cannot load the retired-key sources it exists to fix — validates through the post-retirement schema before converting #9418 fixture: re-pointed to retired spellings whose refusal and conversion still stand.defineAgentcarriesstructuredOutput: { format: 'regex' }, a retired member refused at parse (agent-structured-output-refused-members-removed), andDashboard.createfrom@objectstack/spec/uicarriesrefreshInterval(dashboard-refresh-interval-to-refresh-interval-seconds). Both are protocol 18, which--from 16replays into.agent.lifecycleis not used, because its retirement pins the key absent from the tree. There are still two per-artifact helpers from spec subpaths, so a tolerance scoped todefineStackalone still fails it. Theos validatehalf now matches the refusal's own prescription,--from 17.Acceptance notes
schemaValid, re-parse and idempotence cases that the 12 surviving families need, and asserting the refusal instead would need a separate fixture and a new case. The ruled refusal itself, the unknown-key message naming the upgrade guide, was observed while reproducing this failure (the nightly log'sos validateoutput). The spec owns the unit pins for it.Tests
At head
e3006f2bd(the patch that moved the #9418 fixture offagent.lifecycle; addendum 6464184183 on #27114):packages/spectest:repo81/81 files, 1324 tests (agent-lifecycle-retirement.test.ts14/14); the nightly e2e 19/19; the cli unit project 343/343 files; derived gates 47 at exit 0, 1 NOT-MEASURED (check:dual-build-cjs-loads, dist absent). The readings below are the first head's.At head
f73c11c8(this branch, merged withorigin/main6817bf1ea):OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run test/migrate-meta.e2e.test.ts: before the fix, atd90657b2,Tests 6 failed | 13 passed (19), the same six the nightly names. After:Tests 19 passed (19), lockVERDICT command-exit 0.pnpm --filter @objectstack/cli exec vitest run --project unit: 341 of 343 files and 4929 tests passed, 29 skipped. The two remaining files (published-subpath-console.pin,published-subpath-hook-body.pin) refused before any test because cli's owndist/was not built. Afterpnpm --filter @objectstack/cli buildboth passed (29 tests).Verification
Derived gates (dispatch-gates --commands, 48 families)
node scripts/check-plugin-teardown-shape.mjs --self-testfirst exited 3 (prerequisite: its pinned positive-control commit was outside the shallow clone). After fetching that commit, it exited 0 (48 cases).pnpm check:dual-build-cjs-loadsexited 3,PREREQUISITE NOT MET: it reads every package'sdist/, and only the cli closure was built. Recorded as NOT MEASURED; CI's Lint and Repo Gates runs it.dispatch-gates --ran: 48 derived, 47 run, 1 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN.Generated by Claude Code