Skip to content

os doctor prints ✓ Test coverage / ✓ Deprecations about a tree it never examined (in any user app) #10679

Description

@baozhoutao

Found by QA run #10663 driving cli.doctor-health-report at framework 79ebb37. Also recorded in PR #10147 FOLLOW-UPS §7c (D12); this card is its extraction with live confirmation.

Symptom

In any user-app cwd with no <cwd>/packages/spec/src (a stock create-objectstack -t blank scaffold), os doctor prints verbatim:

  ✓ Test coverage         All *.zod.ts files have matching tests
  ✓ Deprecations          No @deprecated tags found

about a tree it never walked (ls packages/spec/src → "No such file or directory" in the same cwd). Reproduced ×2.

Root cause

findMissingTests (doctor.ts:1141-1143) and findDeprecatedUsages (:1159-1161) both early-return [] when <cwd>/packages/spec/src does not exist; the else branches then print ✓ Test coverage (:1939) and ✓ Deprecations (:1951). This violates doctor's own withhold-the-✓ discipline (the ledgerReadingIsComplete gate at :2063-2065 used for the installed-packages ledger) — a ✓ over an unexamined tree should be withheld, scoped to the tree actually examined, or skipped with a named reason.

Adjacent (same card)

⚠ @objectstack/spec Not built (doctor.ts:1837) probes <cwd>/packages/spec/dist and is monorepo-anchored noise in a user app — same class.

Suggested fix

Gate both ✓ lines on the scanned tree actually existing; when it does not, skip the check (named reason) or scope it. Both checks are monorepo-internal — they should not run, or should announce themselves as skipped, in a user app.

Passing clauses

The seven real health checks pass: env-provenance attribution (#5387), posture-as-error (#5382), ledger independence across postures (#5429), withheld unique-scope on incomplete ledger, config-analysis both ways (orphan view / circular / unused + the three ✓), exit contract (1 iff error, warnings never flip).

QA-source: #10663 · cli.doctor-health-report · clause 7 (expected-fail probe)

Activity

  1. added theissue type on Aug 21, 2026
  2. os-zhuang commented on Aug 21, 2026

    @os-zhuang
    Contributor

    Triage: lands in packages/cli (doctor.ts — findMissingTests/findDeprecatedUsages early-returns + the ✓ print sites + the Not built probe) ⇒ pm:queue · domain:cli · type Bug. Rationale: a ✓ over a tree that was never examined violates doctor's own withhold-the-✓ discipline (ledgerReadingIsComplete precedent at :2063) — restore the invariant: skip with a named reason or scope the line to what was actually walked.

    Serial constraint (fold-or-serial answered): #10680 also edits doctor.ts. Family gate ① fails — different defect shapes (unexamined-tree ✓ scoping vs. a wrong prescribed command hint), different fixes — so the default is serial: this card first, #10680 after it lands (or the cli seat may fold both into one claim by answering the five gates itself at claim time; both are S/M and from the same QA audit). Whoever goes second merges main first and re-reads the touched lines.

    Size/model suggestion: S-to-M, opus floor.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions