Closes #1400 + #1401 · Milestone #113

Bet A polish — mdx guard + schema rewrite

Two follow-ups from the first real /ork:design-ship dogfood (#1399)

#1401 mdx-compile guard

Pre-build CI check that compiles every published .mdx file. Catches the class of bug that broke #1399 (nested same-length code fences in skill SKILL.md sources → unparseable JSX in generated mdx → next-build failure).
  • scripts/test-mdx-compile.mjs (153 lines)
  • tests/unit/test-mdx-compile.sh (88 lines, dual-direction TDD)
  • tests/fixtures/nested-fence.mdx (counter-example)
  • npm run test:mdx + tests/run-all-tests.sh wiring
  • @mdx-js/mdx@^3 + remark-gfm@^4 as devDeps
  • CONTRIBUTING-SKILLS rule: "Nesting code fences" with ❌/✅

#1400 Orchestrator schema

The agent's expected schema diverged from reality. The first iteration assumed a JSON manifest with components[]; real bundles are gzipped tarballs with HTML prototypes + chat transcripts.
  • src/agents/claude-design-orchestrator.md (Handoff Bundle Schema)
  • How-to-parse section with tar-xzf + README-then-chats flow
  • Fallback for incomplete bundles (no project/ dir)
  • ?open_file= query param preference
  • EDITMODE-as-annotation rule
  • src/skills/design-import/SKILL.md Phase 1 prompt updated
  • Outer fence switched to 4-backticks (eats own dogfood)
The bug, side-by-side

Why the fence count matters in CommonMark

❌ #1399 had this — same-length fences don't nest
```python           # outer (3 backticks)
prompt = f"""...
```tsx              # inner (3) — CLOSES the outer
{component['scaffold']}
```                 # now opens a new tsx block
{f"Adapt: {x}" if cond else ''}
"""
```                 # this is now stranded prose
→ MDX parses {f"..." ...} as JSX expression → acorn chokes
✅ This PR fixes it — outer fence is one longer
````python          # outer (4 backticks)
prompt = f"""...
```tsx              # inner (3) — properly nested
{component['scaffold']}
```
{f"Adapt: {x}" if cond else ''}
"""
````                 # closes the outer at 4 backticks
→ Inner content stays inside the outer block; mdx compiles cleanly

Local verification (run on every PR via npm test)