Massu 1.7.0: Cohesive cleanup release
Three structural-quality fixes shipped together because they all share Stage D ceremony cost (npm publish + Vercel deploy + sync-public.sh).
Stage A — website stats SoT drift-guard
New vitest test stats-numbers-against-source-truth.test.ts asserts each homepage stat equals a static derivation from its canonical source:
- MCP Tools count ←
name: p('xxx')patterns acrosspackages/core/src/*/.ts - Workflow Commands count ← public command files under
.claude/commands/massu-*.md(operator-restricted variants are excluded from the count) - Feature Entries ←
tier:lines infeatures.ts - Database Tables ←
CREATE TABLEinwebsite/supabase/migrations/ - Lines of Code (K+) ←
packages/core/src/*/.tstotal / 1000
Adding a new tool/command/migration without updating stats.ts FAILs the test. Companion script website/scripts/regen-stats.mjs emits expected values from the same derivation logic.
CLI Reference doc expanded from 5 CLI commands to 5 CLI + 59 slash commands; new cli-reference-doc-completeness.test.ts drift-guard asserts every external .claude/commands/massu-*.md has a matching ## /<command-name> H2 in the doc.
Team-tool surface gains a runtime cloud-gate via new isCloudFeatureAvailable() helper in packages/core/src/license.ts, wired at tools.ts:175 (registration) and tools.ts:413 (dispatch). Team tools team_search / team_expertise / team_conflicts are now correctly hidden and non-routable for workspaces without explicit cloud.enabled: true.
Stage B — monorepo domain-inferrer fix (P6-004)
topLevelSrcSubdirs in packages/core/src/detect/domain-inferrer.ts:71 no longer hardcodes join(root, 'src') — it now consumes the detected source-dir pipeline. New fixture monorepo-apps-no-root-src with workspaces-driven layout + 4 new domain-inferrer test cases exercise both single-repo non-src/ layouts and monorepos. Generalization-scanner Check 5 prevents the bug class from recurring.
New flattenSourceDirs() helper drops root sentinels (. and '') so root-source repos (Django's manage.py, Swift's Package.swift) continue to use the language-fallback domain (Python, Swift) rather than spuriously enumerating root subdirectories.
Stage C — npm dist-tag hygiene
Stale next: 1.2.1 npm dist-tag (4 minors behind, zero documented consumers) removed via npm dist-tag rm @massu/core next. New ### npm dist-tags policy section in .claude/CLAUDE.md codifies that only latest is maintained going forward. Pre-push step 9 (Dist-Tag Pre-Release) enforces with npm view @massu/core dist-tags parse — FAILs on any next:|beta:|alpha:|rc: channel without an ADR + CLAUDE.md opt-in.
Ship state
npm view @massu/core dist-tags reads:
{ latest: '1.7.0' }Production deploy at https://massu.ai/ HTTP 200; all 4 critical routes (/, /docs, /changelog, /overview) live. Plan converged 14→3→0 across 3 audit iterations pre-loop. See plan-1.7.0-cohesive-cleanup and [1.7.0] in CHANGELOG.md.