Skip to content

docs(qa): refresh cli.doctor-deprecation-scan against head — the expected-fail inverts, and six more texts were stale - #11638

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-11420-doctor-deprecation-scan-refresh
Aug 24, 2026
Merged

docs(qa): refresh cli.doctor-deprecation-scan against head — the expected-fail inverts, and six more texts were stale#11638
os-steve merged 1 commit into
mainfrom
claude/issue-11420-doctor-deprecation-scan-refresh

Conversation

@claude

@claudeclaudeBot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes#11420

Refreshes the cli.doctor-deprecation-scan checklist item against origin/main. Text only — no capability change, no behaviour change, one file.

The named clause inverts — but not in the shape the card expected

Revision 2's acceptance[5] was an EXPECTED-FAIL asserting "the hint must name a command os actually registers; today it does not". #10680 fixed the defect, but the route it took was prescribe nothing, not "prescribe a different command". At head the hint is a two-branch printInfo (doctor.ts:2283-2288):

ℹ Found N deprecated pattern(s). No automated codemod ships with the CLI — apply each finding's replacement by hand (re-run with --verbose to print them).
ℹ Found N deprecated pattern(s). No automated codemod ships with the CLI — apply the → replacement shown under each finding above. (--verbose)

So revision 2's assertion was the wrong shape for head, not a fail that merely flipped — a runner following it would have opened a regression against the landed fix. The clause is now an ordinary pass asserting the hint prescribes no command and routes the operator to the per-finding → replacement, citing the print site's own comment (doctor.ts:2258-2282) for why a repoint at os migrate meta was refused rather than re-deriving the migrate/meta.ts anchors.

Swept the whole item — six more texts were stale

textwhat was wrong at head
titletrailing (expected-fail) phrase described the removed defect
fixtures.knownGapsclaimed "no test anywhere in the repo references --scan-deprecations" — false: #10680 added packages/cli/src/commands/doctor-deprecation-hint-commands.test.ts
steps[2]asked for the closing hint from one run; it is not the same sentence in both
steps[5]recorded "the command the hint prescribes" — it prescribes none
negative[]no negative covered the inverted clause's wrong shapes
source[0]ten of its eleven line anchors had moved

The knownGaps rewrite states what that new pin does and does not reach, so the item keeps the coverage it actually still owns: the pin stages no decoys, mkdirs src/ on every case (so the absent-src probe is never taken), seeds two lines rather than one per pattern, and calls the command class in-process under vitest rather than the shipped binary — leaving the stale-dist trap this item's to catch.

Three negatives added, each a wrong shape a naive fix could reach: an unregistered command name returning; a repoint at os migrate meta (a registered command that still cannot do this job, so it would read as a pass to any check that only asks whether the named command exists); and the count line vanishing along with the prescription.

Line anchors re-derived by content

#10679 moved the scanner block +76 lines and #10680's comment block pushed the print site to +109. Of the eleven numbers revision 2 quoted, only walkDir's node_modules prune at :1130 still held.

revision 2head
DEPRECATED_PATTERNS :1186-1234:1262-1310
retired lookup-scoping pair :1215:1291
scanDeprecatedPatterns :1236-1265:1312-1341
absent-dir early return :1238:1314
.ts-only walk + .test.ts filter :1240:1316
--scan-deprecations flag :1717:1793
scan block :2136-2153, scanDir:2138:2245-2292, :2247
per-hit warning row :2143:2252
verbose → replacement:2144-2146:2253-2255
remediation hint :2149:2283-2288
walkDir node_modules prune :1130:1130 — held

Checked, still correct, deliberately left alone

The harder half. Each was verified at head and not touched:

  • content/docs/protocol/backward-compatibility.mdx:126-134 — the :134 "not yet available" admission still reads as quoted, and at head the tool is consistent with it rather than contradicting it
  • packages/cli/README.md §os doctor (:212-215) — still documents -v and --scan-deprecations
  • packages/create-objectstack/src/templates/blank/src/objects/note.object.ts — still shipped
  • feat(cli): os migrate meta --write — the AST codemod that rewrites authored sources for the mechanical applied set (v18) #9591 — still open, target:v18, pm:on-hold
  • sibling cli.migrate-meta-codemod — still revision 3, its print-only contract still stated correctly
  • the DEPRECATED_PATTERNS count of 8 — recounted at this base, unchanged
  • both personas, both traps, and the four original negatives

Verification

check:platform-checklist was run on the unmodified tree first, so the green is attributable to this change rather than inherited. Identical verdict line before and after:

check-platform-checklist: OK — 15 areas, 207 items (207 active); coverage: 31 kinds mapped,
0 waived; traps: 19 documented, 19 in use; provisioning: 4 area recipes, 7 item references
resolved (1 area-qualified) (self-checks: 22 trap-vocabulary + 34 provisioning-resolve assertions).

Derived gate union (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, from the real changeset), run at dd341879d:

  • pnpm check:doc-authoring✓ doc authoring guard: 389 files clean — no bare metadata literals.
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 420 files / 1449 TS blocks judged clean (self-test 30/30)
  • pnpm check:platform-checklist → verdict above (not in the derived union by design — lint.yml:1205-1211 records the maintainer decision that it is not wired into CI and runs on a manual cadence; run here anyway because it is this area's own gate)

skip-changeset verified against the rule rather than assumed: pr-automation.yml:193-205 gives changeset-check no path-based exemption at all — it counts added .changeset/*.md files whatever the diff touches — so the label is the required mechanism for a PR that publishes nothing. Applied via the additive POST /issues/{n}/labels endpoint and read back.

Out of scope, filed not fixed

#11628docs/qa/platform-checklist/FOLLOW-UPS.md:211-215 §7b carries the same stale claim: it still lists this prescription as unfixed, cites the moved doctor.ts:2149 anchor, and names os migrate meta as "the real path" — the repoint #10680 specifically refused. Separate file, and §7b shows no convention for retiring a resolved row, so the correct shape is the ledger owner's call rather than a guess made here.


Generated by Claude Code

#10680 removed the dead `objectstack codemod v2-to-v3` prescription this
item's expected-fail described, and #10679 moved every doctor.ts anchor it
quoted. The clause inverts — but not into "the hint now names a registered
command": the route taken was prescribe-nothing, so revision 2's assertion
was the wrong SHAPE for head, where the hint deliberately names none.
Six texts changed beyond the named clause, all re-derived at this base: the
title, fixtures.knownGaps (revision 2's "no test anywhere references
--scan-deprecations" is false — #10680 added a pin), steps 3 and 6, three
new negatives, and every line anchor. Of the eleven numbers revision 2
quoted, only walkDir's node_modules prune at :1130 still held.
Verified accurate at head and left alone: backward-compatibility.mdx:126-134,
packages/cli/README.md §os doctor, the blank template, #9591, sibling
cli.migrate-meta-codemod, the DEPRECATED_PATTERNS count of 8, both personas,
both traps, and the four original negatives.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@os-steveClaude

Copy link
Copy Markdown
Collaborator

ACCEPT — PM review. Verified against origin/maine7f56d638 by content, not by report.

The card's assumed fix shape was wrong, and you caught it

The dispatch and revision 2 both carried the same latent assumption: that #10680 would fix the dead prescription by repointing it, so the expected-fail would flip into "the hint now names a registered command." It didn't. I read the print site myself:

doctor.ts:2283-2288
printInfo(
`Found ${deprecations.length} deprecated pattern(s). No automated codemod ships with the CLI — `
+ (flags.verbose
? 'apply the → replacement shown under each finding above.'
: 'apply each finding’s replacement by hand (re-run with --verbose to print them).'),
);

No os … name anywhere in it. So revision 2's clause was the wrong shape for head, not a fail that flipped — and a runner working it as written would have filed a regression against the landed fix. That is the difference between a text refresh and a text refresh that stops the checklist from generating false bug reports, and it is the reason this card was worth its hours.

knownGaps — independently falsified here

Revision 2 asserted "no test anywhere in the repo references --scan-deprecations." Checked on origin/main, with a positive control so a zero reading couldn't be mistaken for confirmation:

packages/cli/src/commands/doctor-deprecation-hint-commands.test.ts PRESENT
packages/cli/src/commands/doctor-nonexistent-control.test.ts ABSENT ← probe discriminates
git grep -l -- '--scan-deprecations' -- 'packages/**/*.test.ts'
→ packages/cli/src/commands/doctor-deprecation-hint-commands.test.ts (exactly one)

False at head, and the rewrite is the right response to that: rather than deleting the gap, it states what #10680's pin does not reach — no decoys, src/ mkdir'd on every case so the absent-src probe is never taken, two seeded lines rather than one per registry entry, Doctor.run in-process rather than the shipped binary. The item keeps stale-dist, which is genuinely still its.

Two moves worth naming

Step 6 changed what the command is evidence for, not which command runs. It went from "record the command the hint prescribes" — dead, since none is prescribed — to a corroboration probe: os codemod --help must still be not-found, because "No automated codemod ships with the CLI" is itself a falsifiable claim. A registered codemod would make the new hint the next false statement. Retargeting a step at the fix's own honesty is better than dropping it.

The os migrate meta negative is the one that closes the class. A repoint there is a registered command that still cannot do the job, so it reads as a pass to any check that only asks whether the named command resolves — precisely the check a naive reviewer runs. Writing that down is what stops the next revision from accepting the same defect respelled.

Verification standard — the honest call accepted

check:platform-checklist run on the unmodified tree first and diffed mechanically, identical verdict line both ways: that establishes attributability (the green is not inherited), and you framed it as exactly that rather than dressing it up as non-vacuity. No ablation, correctly — this is checklist text with no code path to mutate, and inventing one would have been theatre. skip-changeset justified from pr-automation.yml:193-205 rather than assumed, noting changeset-check has no path-based exemption at all.

Two environment notes, both diagnosed rather than reported as results:

Out of scope

#11628 filed, not fixed — correct. Separate file, and §7b carries no visible convention for retiring a resolved row, so the shape is the ledger owner's call. Queued for triage.

Flipping ready and arming the queue.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-steve@claude