Uh oh!
There was an error while loading. Please reload this page.
docs(objectql): archiveObject's triple note points at the #10643 parse-time refusal - #11007
Conversation
…e-time refusal The `retention` + `ttl` + `archive` paragraph in the `archiveObject` docblock still called #10527 an open question and warned about a shape the spec no longer accepts. #10643 (5649efb) decided it: `LifecycleSchema` refuses that triple unless `ttl.field` is `created_at` and `ttl.expireAfter` equals `retention.maxAge` (itself pinned equal to `archive.after`), so every triple reaching this method selects the same column at the same declared instant on either branch. The rewrite keeps the still-live half: the equality is enforced in `packages/spec` and re-checked nowhere in this file, so widening that accept-set brings the union-vs-refusal question back to this line. Comment-only; no executable line changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019yDEhPBC3tcGkW9bkce1HM
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. ✅ What this run could not see
Coarse fallback — 14 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 3a4153dd6a028787fdc117801dc889fc4bb562c5 && git checkout 3a4153dd6a028787fdc117801dc889fc4bb562c5
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 490879ad0fe22c57d74799828a49feac6860757a 4b635de3048c2b40925f10f7ca6849c23c0bd278 && git checkout -B drift-repro 490879ad0fe22c57d74799828a49feac6860757a && git merge --no-ff 4b635de3048c2b40925f10f7ca6849c23c0bd278
node scripts/docs-audit/affected-docs.mjs --json 490879ad0fe22c57d74799828a49feac6860757a |
Uh oh!
There was an error while loading. Please reload this page.
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32553282881 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Fixes#10865
Comment-only. The
archiveObjectdocblock paragraph immediately above thedueFieldselection still called theretention+ttl+archivetriple an open question (#10527) and warned about a shape the spec no longer accepts. #10643 (5649efbf93) answered it with the parse-time-refusal disposition, so the paragraph now says so and points there.Citation, not a control
Nothing here is broken and nothing is unenforced, so there is no behaviour to fix and no test to add. What can be established is that the replacement prose is true, and the evidence is a citation of the refine that was read at
packages/spec/src/data/object.zod.ts(read-only for this card — unchanged):and, a few lines above it in the same
superRefine, the alignment refine that has always been there:Together: a triple that parses today has
ttl.field === 'created_at'andttl.expireAfter === retention.maxAge === archive.after.lifecycleDurationis a plain regex-validated string with no transform (object.zod.ts,LIFECYCLE_DURATION_REGEX), so those equalities are literal-for-literal —'30d'vs'720h'is refused too. On such a triple the selection below the comment reads the same column at the same declared instant whichever branch it takes, so the hazard the old note raised ("the age bound no longer separately bounds the hot store") is not a shape that can reach this method.packages/spec/src/data/object.test.tspins the accept/reject pairs (describe('retention + ttl + archive triple (#10527)')).What was preserved
The old paragraph was not only a stale question. Two things in it are still live and are kept, restated:
packages/specand re-checked nowhere in this file — so widening the triple accept-set there brings the original union-vs-refuse question straight back to this line. That is the constraint the paragraph is now defending, in place of the question it used to pose.ttldeclared it is theexpireAfteroverride key that applies, notmaxAge(the settings override map carries those as two distinct optional keys, andfloorFor(object, policy)is keyed by policy). The[#10528]block below owns that reasoning; the new text only points at it, so a reader does not read "the two windows are the same instant" as "a triple behaves identically to an archive-only object in every respect".Non-effects
No behaviour change, no test change, no
packages/specchange. The diff touches only//comment lines — mechanically checked:git diff HEAD~1 -U0, keeping only added/removed lines and dropping the file headers, leaves zero lines that are not a//comment.Verification
Gate union derived with
node scripts/pm/dispatch-gates.mjs(no path arguments) after the final commit, at4b635de304; every family it named was run at that same sha, exits captured before any pipe. All eight green:pnpm check:durability-log-level✓ durability-degradation log levels: 30 durability-critical catch seam(s), all loud …pnpm check:slot-lookup✓ slot-lookup ratchet holds: 107 unswept site(s) in 25 file(s), none new …pnpm check:test-source-aliascheck-test-source-alias OK — 72 packages with tests scanned …pnpm check:type-source-resolutioncheck-type-source-resolution OK — 77 packages with a tsconfig.json scanned …node scripts/check-ci-filter-parity.mjsOK: all 82 declared cross-package glob(s) (71 unique) are covered …node scripts/check-engine-split-ratio.mjsnode scripts/check-plugin-teardown-shape.mjs✓ check:plugin-teardown-shape: 61 Plugin implementation(s) … baseline fully burned downnode scripts/docs-audit/check-affected-docs.mjs✓ affected-docs self-test: 339 cases pass.Declared narrowing:
@objectstack/objectql's owntest/typecheckwere not run locally. Building that package's dependency closure to type-check a diff that is provably comment-only buys nothing the shared verify lock's cost justifies, and CI runs the farm regardless. In their place: the comment-only proof above, plus a real parse of the edited file (esbuild packages/objectql/src/lifecycle/lifecycle-service.ts --outfile=/dev/null, exit 0), which is what a comment edit can actually break.Changeset
None, deliberately: nothing user-visible ships — no published behaviour, API or type changes, only a source comment.
skip-changesetis the repo's only exemption path forchangeset-check(the gate has no file-type carve-out, by design), so it belongs on this PR; the label write from this seat is reported in the dev report on #10865.Generated by Claude Code