Skip to content

Develop is red: wire the animation MCP into every contract that enumerates servers, and derive the collector's package flags from the shared rule - #585

Merged
jonit-dev merged 3 commits into
developfrom
fix/develop-animation-mcp-red
Oct 28, 2026
Merged

jonit-dev merged 3 commits into
developfrom
fix/develop-animation-mcp-red

Conversation

@jonit-dev

@jonit-dev jonit-dev commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

What is this PR about?

Repairs every failure on develop's head 72590f3a4 (#582). develop has been red for two runs, so PR #574, #583 and any other PR into develop pays a red base.

Why does it matter?

Nothing lands until develop is green: the same tree fails 10 jobs with real product causes, not flakes.

The failures, and why

PRD-760 made threenative-animation a default MCP server in every scaffold, but the places that enumerate servers still listed four, and the native collector still knew two MCP package names by hand.

Job Failure Cause
test-unit (2/4) doctor.spec.ts > pins every MCP server at the version @threenative/core actually installs, verify-golden-path.spec.ts > probes every server the scaffold actually wires doctor's core-resolved set and golden path's surface list name four servers
test-unit (3/4) package-externals.spec.ts, verify-registry-install.spec.ts (8 cases) no recorded surface for the fifth server; the self-contained stdio tool is judged by the shared-runtime gate
test-unit (4/4) release.spec.ts > validates the real candidate's template pins and bundled MCP servers the bundled server list names four
budgets quality gate failed: 1 suppression-class finding(s) are new, grew, or lack a waiver reason the v2/v3 recipe cast in upgradeLog has no waiver reason
native-platforms (macOS, Windows, parity), test-native TN_PROD_EVIDENCE_INVALID: TN_PROD_PACKAGE_FLAG_UNSUPPORTED: threenative-animation-mcp the collector's copy of the package-flag rule named blender-mcp and engine-mcp by hand

Done

  • ✅ One source of truth for the flag rule. scripts/workspace-packages.ts already owns it; the collector's copy now states the same rule — byte-identical to PR Starter kits: Unreal look, shooter revamp, performance by construction, kit contract and worker mode (PRD-723/746/747/748/749/752) #574's copy, so the 557-file PR merges without touching this hunk — and profile-production.spec.ts holds the two equal for every workspace package. Red → green: with the old rule restored the new case fails with TN_PROD_PACKAGE_FLAG_UNSUPPORTED: threenative-animation-mcp.
  • ✅ The fifth server is enumerated everywhere it must be: doctor's core-resolved pins, golden path's surfaces and probe (animation_inspect on an owned empty GLB), registry install, the release spec's bundled list, and a recorded animation-mcp-tools.json captured by prepare-release.
  • ✅ The stdio tool is excused from the shared-runtime gate by name, and the excuse requires a bin — a game never imports it, so no second copy of three.js can meet the game's own.
  • ✅ The waiver names its reason.
  • ✅ Change scope can classify again. On this PR, Change scope was cancelled three times at exactly 5m00s–5m09s with actions/checkout still running: the job's 5-minute timeout against a fetch-depth: 0 clone of a 3.9 GB repository. This carries Starter kits: Unreal look, shooter revamp, performance by construction, kit contract and worker mode (PRD-723/746/747/748/749/752) #574's measured fix (blob-less fetch, filter: blob:none, 8 s and 20 MB for the same plan) so the repair is reviewable at all. Regression cases: ci-structure.spec.ts + ci-needs.spec.ts 234 passed.

Evidence

  • pnpm exec vitest run packages/runtime-native/__tests__/profile-production.spec.ts — 11 passed; the new case fails against the old rule (verified by stashing the rule only).
  • pnpm exec vitest run packages/create-threenative/__tests__/doctor.spec.ts scripts/__tests__/{release,package-externals,quality-json,mcp-tool-schemas,verify-registry-install,verify-golden-path}.spec.ts — 200 passed, 7 files.
  • pnpm exec vitest run scripts/__tests__/ci-structure.spec.ts scripts/__tests__/ci-needs.spec.ts — 234 passed.
  • pnpm budgets — budgets ok; pnpm quality — exit 0, no suppression-class finding is new, grew, or unwaived; pnpm typecheck — exit 0.
  • pnpm exec biome check on both touched source files — warnings only (pre-existing complexity in the collector).
  • Flag round-trip through the scaffolder: threenative-animation-mcp → --animation-mcp-package → threenative-animation-mcp, and all four unscoped packages round-trip.
  • Full board dispatched on 318e7192 (ci.yml, manual qualification) — the macOS/Windows native legs cannot run from a workstation.

Doubt left open

native-platforms / Desktop web/native parity also failed TN_FRAME_BUDGET_PHASE_OVER_BUDGET: the 'ui' phase is 2.75 ms at p95 on one develop run only, after passing on the previous one. Nothing in #581/#582 reaches packages/runtime-native render, packages/ui, or the UI composite, and the bound is not edited here. If it recurs on a develop run it is a real regression and needs its own diagnosis.

Conflict note for #583

#583 waives the same upgradeLog cast with its own wording. Whoever merges second resolves one line; this side is written first only because the base must go green for anything else to land.

…ctor contracts it joined (PRD-760)

PRD-760 made threenative-animation a default server in every scaffold, but the places that enumerate the servers still listed four.

- doctor: the server resolves to @threenative/core like engine and blender, so its pin is core's version, not an unpublished dependency.
- golden path and registry install: add the server's recorded surface (animation-mcp-tools.json, captured by scripts/capture-blender-mcp-tools.ts animation and by prepare-release) and a safe animation_inspect probe on an owned empty GLB.
- release spec: the bundled server list names the fifth server.
- package externals: threenative-animation-mcp is a self-contained stdio tool (core commits its bundle, its page loads one browser file), so it is excused from the shared-runtime gate, and the excuse requires a bin.
- quality: waiver reason on the v2/v3 recipe cast in upgradeLog.
… flag from the shared rule

A develop push builds threenative-animation-mcp, so the collector passed it to
the scaffolder and threw TN_PROD_PACKAGE_FLAG_UNSUPPORTED: its copy of the flag
rule named the two MCP packages by hand. macOS desktop core, Windows desktop
core, desktop parity and test-native all died there.

It now applies scripts/workspace-packages.ts workspacePackageSourceFlag's rule
(scoped packages derive their flag, an unscoped threenative-* package drops its
prefix), and profile-production.spec.ts holds the copy equal to the original for
every workspace package, so the next package cannot drift it again.

Verified: profile-production.spec.ts 11 passed; the case fails with the old
rule restored.
@jonit-dev
jonit-dev force-pushed the fix/develop-animation-mcp-red branch from 0aea26b to 318e719 Compare October 28, 2026 18:10
Change scope cancelled three times on PR #574 (merge queue attempt 3, PR run 40727651261, merge queue attempt 7) with actions/checkout still fetching every branch of the 3.9 GB repository when the job's 5-minute timeout hit, on loaded tn-local runners.

Scope reads commits and trees (rev-parse, cat-file, rev-list) and fetches missing commits itself, so the checkout takes filter: blob:none. Measured locally: a blob-less fetch of all 532 branches takes 8 s and 20 MB with the full 2263-commit develop history, and ci-change-scope.mjs prints a byte-identical plan for the PR merge commit 952193d from the blob-less clone and from a full clone (scope=review).

Checks: the 29 workflow specs 804/804.
@jonit-dev
jonit-dev merged commit e1189d4 into develop Oct 28, 2026
21 of 23 checks passed
@jonit-dev jonit-dev mentioned this pull request Oct 28, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant