Silence render-disposed spam, unbreak bundled skills, drop board wake

Three independently ugly bugs that all fed the same log flood:

* Electron's `WebFrameMain.send` writes every "Render frame was disposed"
  to stderr via `console.error`. When the worker fans a second
  agent-event past a reloading renderer, we produced thousands of
  identical lines and stalled the main loop on stderr I/O. Added a
  `mainFrame.detached` guard so the send is short-circuited before
  Electron's own catch block fires, and installed a targeted filter in
  `suppress-warnings.ts` (now actually imported from the entry point)
  so the specific `console.error("Error sending from webFrameMain:"…)`
  noise never reaches the terminal. Any other payload still surfaces.

* `dispatchAgentMessage` accepted the human-reader sentinel as a wake
  target when an agent replied to `__board__` — `wakeAgentIfPossible`
  then called `db.getAgent("__board__")`, threw, and the dispatcher
  kept repeating on every send. Strip `HUMAN_SENDER_ID` at
  `resolveMessageWakeTargets`, and keep a defense-in-depth guard in the
  heartbeat so a stray caller (future automation fan-out) cannot
  reintroduce the crash.

* Pi's skills loader rejects any SKILL.md whose frontmatter `name`
  diverges from its parent directory. The four bundled `my-writing-style`
  copies declared `name: writing-style-skill`, so every install emitted
  a warning and dropped the skill. They also lived as orphan gitlinks
  (mode 160000 without .gitmodules), and the global `*.md` gitignore
  hid every other SKILL.md from version control. Fixed the frontmatter
  to match the dir, converted the dangling submodules to plain trees,
  and allowlisted `builtin-skills/**/*.md` so a fresh clone carries the
  catalogue instead of silently losing it.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-20 08:13:48 -04:00
1 parent 7a9a6779b0
commit e74dafcd36
287 files changed
+59858 -10

No files matched your search

@@ -0,0 +1,261 @@
---
# ═══════════════════════════════════════════════════════════════════════════
# SKILL: Mobile Development
# Version: 2.0.0 | Updated: 2025-01
# ═══════════════════════════════════════════════════════════════════════════
name: mobile-development
description: iOS (Swift, SwiftUI), Android (Kotlin, Compose), cross-platform (Flutter, React Native), and game development (Unity, Unreal).
# ACTIVATION TRIGGERS
triggers:
- ios
- android
- flutter
- react native
- mobile
- swift
- kotlin
- unity
- game development
# SKILL PARAMETERS
parameters:
platform:
type: string
enum: [ios, android, cross-platform, games]
required: true
project_type:
type: string
required: false
description: Type of app (social, productivity, game, etc.)
# OUTPUT SPECIFICATION
outputs:
recommended_stack:
type: object
learning_path:
type: array
portfolio_projects:
type: array
# RELIABILITY
retry:
max_attempts: 3
backoff: exponential
# OBSERVABILITY
observability:
log_level: info
level: advanced
prerequisites:
- core-development
sasmp_version: "1.3.0"
bonded_agent: 01-core-paths
bond_type: PRIMARY_BOND
---
# Mobile Development Skill
## Quick Reference
| Platform | Language | Framework | Timeline | Job Market |
|----------|----------|-----------|----------|------------|
| **iOS** | Swift | SwiftUI | 6-9 mo | High |
| **Android** | Kotlin | Compose | 6-9 mo | High |
| **Cross-Platform** | Dart | Flutter | 4-6 mo | Growing |
| **Games** | C# | Unity | 12-24 mo | Moderate |
---
## Learning Paths
### iOS Development
```
[1] Swift Fundamentals (4-6 wk)
│ └─ Types, optionals, closures, protocols
│
▼
[2] SwiftUI (4-6 wk)
│ └─ Views, modifiers, state, binding
│
▼
[3] Navigation + Data (3-4 wk)
│ └─ NavigationStack, SwiftData/Core Data
│
▼
[4] Networking + Async (2-3 wk)
│ └─ URLSession, async/await, Combine
│
▼
[5] Testing + App Store (2 wk)
└─ XCTest, TestFlight, submission
```
**2025 Stack:** Swift 5.10 + SwiftUI + SwiftData + Xcode 16
---
### Android Development
```
[1] Kotlin Fundamentals (4-6 wk)
│ └─ Null safety, coroutines, data classes
│
▼
[2] Jetpack Compose (4-6 wk)
│ └─ Composables, state, effects
│
▼
[3] Architecture (3-4 wk)
│ └─ MVVM, Room, Navigation
│
▼
[4] Networking + DI (2-3 wk)
│ └─ Retrofit, Hilt, Flow
│
▼
[5] Testing + Play Store (2 wk)
└─ JUnit, Espresso, release
```
**2025 Stack:** Kotlin 2.0 + Jetpack Compose + Room + Hilt
---
### Flutter (Cross-Platform)
```
[1] Dart Fundamentals (2-3 wk)
│
▼
[2] Flutter Widgets (3-4 wk)
│
▼
[3] State Management (2-3 wk)
│ └─ Riverpod or Bloc
│
▼
[4] Backend Integration (2 wk)
│ └─ Firebase, REST APIs
│
▼
[5] Deploy to Both Stores (1 wk)
```
**2025 Stack:** Flutter 3.x + Dart 3.x + Riverpod + Firebase
---
### Game Development
```
[1] Game Basics (4-6 wk)
│ └─ Game loop, input handling
│
▼
[2] Unity/C# Fundamentals (6-8 wk)
│ └─ GameObjects, Components, Scripts
│
▼
[3] Physics + Graphics (4-6 wk)
│ └─ Rigidbody, colliders, shaders
│
▼
[4] Audio + Polish (2-4 wk)
│
▼
[5] Publish (ongoing)
└─ Steam, App Store, Play Store
```
**2025 Stack:** Unity 6 LTS + C# OR Unreal 5.4 + C++
---
## Platform Decision Tree
```
Which platform?
│
├─► Apple ecosystem only?
│ └─► iOS (Swift + SwiftUI)
│
├─► Android ecosystem only?
│ └─► Android (Kotlin + Compose)
│
├─► Both platforms?
│ ├─► Performance-critical? → Native for both
│ ├─► Budget/time limited? → Flutter
│ └─► Web developer background? → React Native
│
└─► Making games?
├─► 2D/3D indie → Unity
├─► AAA quality → Unreal
└─► Simple 2D → Godot
```
---
## Game Engine Comparison
| Engine | Market | Language | Learning | Best For |
|--------|--------|----------|----------|----------|
| **Unity** | 51% | C# | Medium | Indie, mobile, VR |
| **Unreal** | 31% | C++/BP | Hard | AAA, high-fidelity |
| **Godot** | 10% | GDScript | Easy | Indie, 2D |
---
## Troubleshooting
```
Native vs Cross-platform?
├─► Need platform-specific APIs (HealthKit, ARCore)? → Native
├─► Performance-critical (AR/VR, complex animations)? → Native
├─► Budget or time limited? → Flutter
├─► Team knows JavaScript? → React Native
└─► Starting from scratch? → Flutter (best DX)
Simulator works, device doesn't?
├─► Missing entitlements/capabilities?
├─► Different iOS/Android version?
├─► Network connectivity issues?
└─► Always test on real devices from day 1
App rejected by store?
├─► Read rejection reason carefully
├─► Check App Store Review Guidelines
├─► Most common: metadata issues, crashes, spam
└─► Appeal if unjustified
```
---
## Common Failure Modes
| Symptom | Root Cause | Recovery |
|---------|------------|----------|
| Slow UI | Too many recompositions | Profile, optimize state |
| Memory leaks | Not cleaning up resources | Use lifecycle-aware components |
| App rejected | Guidelines violation | Read guidelines BEFORE building |
| Game stutters | Draw call overhead | Object pooling, LOD, batching |
---
## Portfolio Projects
### Mobile (Progressive)
1. **Todo App** - CRUD basics
2. **Weather App** - API integration
3. **Chat App** - Real-time, auth
4. **Payment App** - Stripe, security
### Games
1. **2D Platformer** - Physics basics
2. **3D Runner** - 3D graphics, particles
3. **Multiplayer Game** - Networking
---
## Next Actions
Specify your target platform for a detailed learning plan.
@@ -0,0 +1,73 @@
# Mobile Development Guide for Cloudflare
## PWA on Cloudflare Pages
```json
// manifest.json
{
"name": "My PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#f38020",
"icons": [
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
```
## Service Worker with Cloudflare
```typescript
// sw.ts - Offline-first strategy
const CACHE_NAME = 'v1';
const OFFLINE_URL = '/offline.html';
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll([OFFLINE_URL, '/', '/styles.css']);
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request).catch(() => caches.match(OFFLINE_URL))
);
});
```
## Mobile API with Workers
```typescript
// Optimized for mobile clients
export default {
async fetch(request: Request, env: Env) {
const userAgent = request.headers.get('User-Agent') || '';
const isMobile = /Mobile|Android|iPhone/i.test(userAgent);
return Response.json({
data: await getData(env),
optimized: isMobile ? 'mobile' : 'desktop'
}, {
headers: {
'Cache-Control': isMobile ? 'max-age=300' : 'max-age=3600'
}
});
}
};
```
## Deployment
```bash
# Deploy to Cloudflare Pages
npx wrangler pages deploy dist --project-name=my-pwa
```
---
*Cloudflare Plugin - Mobile Development Skill*