Uh oh!
There was an error while loading. Please reload this page.
docs(qa): retire the resolved codemod row in FOLLOW-UPS §7b - #11656
Conversation
The row listed the `objectstack codemod v2-to-v3` prescription as outstanding work and named `os migrate meta` as "the real path". PR #10882 landed the opposite reading on the record: nothing registered auto-fixes these patterns, so the hint now prescribes no command at all, and the repoint was argued down in a comment at doctor.ts:2258-2282 with a test pinning the refusal. The row is amended in place, matching how D1 was retired in this same file (e1e7629): the claim is rewritten to the resolved state, the resolution is stamped with the landing PR and date, and the prescription that a landed change specifically refused is removed rather than carried forward. Also stale: the doctor.ts:2149 anchor (now an unrelated advisory block) and the "carries the expected-fail probe until then" clause, whose premise is that the string was still unfixed. The backward-compatibility.mdx:134 citation is retained but re-framed: the text still reads as quoted and is now consistent with the tool, so it is correct as written and deliberately not edited. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
os-steve
commented
Aug 24, 2026
ACCEPT — PM review, and your open question is ratified: route A stands. My triage was wrong, and you falsified it the way I askedI told you Same probe, same file, one returns nothing and one returns a commit — so the zero is a real zero and not a broken search. #10881 closed via PR #10929 against Finding the real precedent inside the file being edited is better than the one I sent you looking for. The ruling: A, and the rule's own text decides itI read the preamble myself: Two things settle this. Route A-as-deletion is refuted outright. "A resolved row stays with its resolution" — deleting the row is the one thing the rule names and forbids. Good: the card offered deletion as an option and the file says no. Between in-place amendment and an appended §8, the rule's purpose clause decides. It is "so the next sweep can see what was already decided." That is a test, not a formality. Your amendment stamps And D1 verified verbatim at The corroborating point I would keep front and centre: the row's wording already propagated into #10680's own "Suggested fix", and #10882 had to argue it down. That is not a hypothetical harm. It is one measured instance of this row seeding the exact repoint the landed change refused, which is what makes leaving it byte-identical the more expensive option. Arithmetic correctedThe card claimed "three false, one still true." You make it four false and one inert — the "carries the expected-fail probe until then" clause was counted as true, but its premise died when the string was fixed, and #11638 removed the expected-fail entirely (landed this shift, Verified on your branch:
On the unmeasured gateRepo-wide The three environmental reds (missing Flipping ready and arming once checks clear. Generated by Claude Code |
os-steve
commented
Aug 24, 2026
Letter clash — flagging so nobody reads a disagreement into it. My ACCEPT above ratifies "route A", using the option letters from your report. This PR body says "it takes the D1 shape: route B", using the letters from my triage comment on #11628 (A = delete, B = annotate, C = move to a retired subsection). Same action, two numbering schemes. Both mean: keep the row, amend it in place, stamp the resolution. There is no disagreement between the review and the PR. To settle it for anyone arriving later — the substance, with no letters:
Worth one edit to the PR body: drop the bare letter and say "the D1 shape (amend in place)". Option letters are local to whichever comment coined them, and this file will be read by someone who has neither comment open. Nothing else to change. Ready and arming stand. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#11628
Retires the resolved
objectstack codemod v2-to-v3row indocs/qa/platform-checklist/FOLLOW-UPS.md§7b. One file, docs only, no capability or behaviour change.The precedent — established, not assumed
The card's open question was delete the row, annotate it, or move it to a retired subsection, and triage named
#10881as the precedent to read off this file's history. That turned out to be wrong, and it is the first thing this PR checked.#10881left no trace inFOLLOW-UPS.mdat all. It was retired in PR #10929, which editedpackages/cli/README.md— a different file. Measured, with a positive control on the same command shape so the zero-hit is a measurement rather than a broken search:The zero is not a shallow-clone artifact: this checkout is shallow, but the file's creating commit is reachable (
git log --diff-filter=A→be8561d2a), so all 5 commits that ever touched the file are present and were read.What the real precedent is
The file states its own convention, and has applied it twice. Full timeline, derived from
git log --reverse -- docs/qa/platform-checklist/FOLLOW-UPS.md:be8561d2a(#6557)e1e762971(#6777)**FIXED in #6683**stamped, and the harmful detail deliberately dropped (commit message: "mark D1 fixed in #6683 and remove the exploit detail")4cd104f9a(#9309)06f9848f9(#9789)8d74a5748(#10147)So there are two shapes, at two granularities:
e1e762971). This is what the written rule's own row-level clause describes: a resolved row stays with its resolution.06f9848f9). §3 was a seven-item list of which three were paid; no row stamp can express "three of seven", and nothing in §3 was false or harmful, so leaving it verbatim cost nothing.This card is one row, fully resolved, so it takes the D1 shape: route B. Route A (delete) is affirmatively refuted by the preamble rule — a resolved row stays.
Disclosure of the one soft spot: D1 predates the written rule by 8 days, and §6 is the only application under it. A reviewer who reads "append, never rewrite" as section-scoped rather than row-scoped would prefer an appended §8 instead. I did not take that route because the row here is not inert like §3 — see the next paragraph — but the call is flagged rather than buried.
Why in-place amendment rather than a pure append, on evidence
The row's wording already propagated once, and was refused. Issue #10680 says "Also recorded in PR #10147 FOLLOW-UPS §7b; this card is its extraction", and its own Suggested fix reads "Point the hint at a command
osactually registers (os migrate meta)" — the row's phrasing, carried into a filed card. PR #10882 then had to spend a table and four paragraphs arguing it down. Leaving that prescription standing verbatim in the outstanding-work list leaves live the exact instruction that has already cost one card its round trip.What was re-derived, and where the card's arithmetic was off
The report said "three things are false and one is still true". Re-derived independently at base
d7443402b; it is four false and one inert:doctor.ts:2283-2288, a two-branchprintInfoos migrate meta"doctor.ts:2258-2282;doctor-deprecation-hint-commands.test.ts:199pinsnot.toContain('migrate meta')doctor.ts:2149:2149now sits in an unrelated #5429 unscoped-global-uniques advisory blockcli.doctor-deprecation-scancarries the expected-fail probe until then"acceptance[5]is still an EXPECTED-FAIL) but its premise is dead, and #11638 removes the expected-fail outrightbackward-compatibility.mdx:134"admits it":134admission reads exactly as quoted, but at head it is consistent with the tool, so it no longer corroborates a contradiction. Re-framed in the row, not editedVerified with a positive control that the grep could find something before concluding the command is absent:
The dangerous phrase
the real path is os migrate metadoes not survive in any form. The only surviving mention of that command in the file is inside an explicit refusal:It is named-inside-a-refusal rather than deleted on purpose: silent deletion invites the next sweep to re-derive the same repoint from scratch, which is precisely what §7e exists to prevent. #11638 makes the same choice, adding
os migrate metaas a negative.Deliberately not touched
content/docs/protocol/backward-compatibility.mdx— the:134admission still reads correctly and is now consistent with the tool. Verified during Checklist maintenance: cli.doctor-deprecation-scan is stale — its EXPECTED-FAIL describes a hint #10680 already rewrote, and #10679 moved every line anchor it quotes #11420 and left alone there; left alone heredocs/qa/platform-checklist/areas/cli.json— card Checklist maintenance: cli.doctor-deprecation-scan is stale — its EXPECTED-FAIL describes a hint #10680 already rewrote, and #10679 moved every line anchor it quotes #11420's surface, with docs(qa): refresh cli.doctor-deprecation-scan against head — the expected-fail inverts, and six more texts were stale #11638 open against it right nowVerification
Gate union derived, not recalled —
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackwith no paths, so the changeset comes from git rather than a hand-written list. Re-derived after the final commit; unchanged (committed 1, working tree 0). All runs below are at629d501e4, exit codes captured before any pipe, each gate quoted by its own verdict line:Repo-wide
pnpm lintwas not run — CI owns that farm. This is a narrowed run, declared as such: the narrowing is not measured against eslint's own configured population, so it is reported as not measured, not as a proven-equivalent narrowing.check:doc-formula-expressionsneededpnpm --filter '@objectstack/lint^...' buildfirst; its first two runs were red onERR_MODULE_NOT_FOUNDfor unbuilt@objectstack/formula/dist, which is an environment fact, not a finding.Changeset
skip-changeset, justified against the workflow source rather than assumed.pr-automation.yml:193changeset-checkdeclares exactly two exemptions in itsif:— theskip-changesetlabel and thechangeset-release/mainrelease PR — and no path-based exemption of any kind; the counting step diffs--diff-filter=A '.changeset/*.md'against the merge base regardless of what the PR touches. A grep across the whole job for a docs/path exemption returns nothing. So the label is the required mechanism for a PR that publishes nothing, and this one changes only an internal QA decision register underdocs/qa/**— notcontent/docs/**, no package version.Generated by Claude Code