## Summary
Removes the Rhodes weighted readiness metric and its red/yellow/green interpretation
from every Aerie-owned MCP surface. This is a deliberately subtraction-only change:
it retires the getReadinessAssessment tool entirely and strips the same score,
score-derived rating, and color buckets from the retained getSiteHealth and
getPortfolioHealth views — without introducing any replacement score, ranking,
status, payload redesign, or UI. The retained views keep their factual milestone
progress, issue counts, issue strings, and concrete blockers unchanged.
This is an intentional breaking contract change for external MCP clients: callers of
getReadinessAssessment will receive tool-not-found after refreshing discovery, and
clients parsing score, rating, or portfolio color buckets from the retained health
responses must stop depending on those fields.
### Changes
Convex backend
- chat/convex/rhodes/mcp.ts — Delete the getReadinessAssessment query and the
readiness-note selection/DTO helpers (READINESS_NOTE_*, READINESS_RISK_TERMS).
getSiteHealth and getPortfolioHealth drop score, rating, summary color
counters, and score-based site ordering while retaining factual progress, issues,
and topBlockers.
- chat/convex/rhodes/runtime/siteReadModels.ts — Replace computeScores/getRating
and the 40/20/20/20 weighted formula with collectSiteHealthFacts, a factual helper
exposing only completed/total milestones, overdue milestones, missing DRIs, and
per-milestone document counts.
- chat/convex/rhodes/runtime/constants.ts — Remove the now-unused
health-score-specific constant.
MCP surfaces and clients
- chat/rhodes-worker/mcp-server/tools/views.ts — Delete the getReadinessAssessment
registration; strip score/rating/color/worst-scoring promises from the retained tool
descriptions.
- chat/lib/rhodes-mcp-contract.ts, chat/lib/agent.ts — Remove the tool name
from the in-app and broader agent catalogs so it is no longer advertised or allowed.
- chat/rhodes-worker/lib/domain-knowledge.ts — Delete the HEALTH_SCORE section
(formula, thresholds, report-the-score instruction) from buildDomainKnowledge().
- chat/rhodes-worker/src/index.ts, chat/rhodes-worker/mcp-server/index.ts —
Remove health-scoring language from the remote and stdio resource descriptions.
- chat/components/rhodes-cards/rhodes-read-card.tsx — Delete the
getReadinessAssessment switch case and its ScoreCard; remove the name from
rhodesReadCardToolNames.
- chat/scripts/rhodes-mcp-parity.mjs — Record the intentional parity drift so an
external Rhodes checkout may still contain the tool.
Tests
- chat/convex/rhodesMcpParity.test.ts — Rewrite health tests around retained
factual fields and explicit absence of score/rating/color buckets and score-based
prioritization.
- chat/lib/__tests__/agent.test.ts — Add negative assertions that the retired name
is absent from both tool arrays, HTTP MCP configs, and generated allowedTools.
- chat/rhodes-worker/mcp-server/tools/views.test.ts *(new)* — Assert the shared
registry omits getReadinessAssessment while retaining both health tools with
score-free descriptions.
- chat/rhodes-worker/lib/domain-knowledge.test.ts *(new)* — Assert the built
resource contains no weighted formula or thresholds, with unrelated sections as
positive controls.
- chat/rhodes-worker/package.json — Wire the two new worker test files into the
package test command.
Docs
- features/rhodes-mcp/remove-readiness-scoring/*.md *(new)* — Implementation plan
and exposure research.
### Design Decisions
- Subtraction only, no replacement. No new readiness score, health rating, attention
state, prioritization rule, or portfolio ranking is introduced. Removing response
fields without also removing the domain-knowledge formula would leave the model primed
to reconstruct the retired metric, so the guidance is deleted in the same change.
- Portfolio ordering had a hidden dependency on the score. getPortfolioHealth used
the weighted score to both populate fields and to choose/order its returned sites. The
score-based sort is removed and rows fall back to natural construction order under the
existing ten-site cap — no replacement priority semantics added.
- Concrete issue severity is retained. topBlockers.severity derives from specific
conditions (e.g. an overdue milestone), not the aggregate readiness rating, so it stays.
Unrelated P2 quality-bar RAG, greenlight, and campus scoring are untouched.
## Test Plan
- [x] pnpm --filter @bran/chat exec vitest run convex/rhodesMcpParity.test.ts lib/__tests__/agent.test.ts
- [x] pnpm --filter @bran/location-os-mcp-worker test
- [x] pnpm --filter @bran/chat typecheck + pnpm --filter @bran/location-os-mcp-worker typecheck
- [x] Pre-commit hooks (biome + typecheck-chat + convex-paths) pass on every commit
- [ ] pnpm --filter @bran/chat rhodes:mcp-parity when the separate Rhodes checkout is available
- [ ] Run MCP tools/list against full, read-only, and OAuth sessions; confirm
getReadinessAssessment is absent and both health tools remain
- [ ] Call both retained health tools and confirm the JSON has no score/rating/color fields