Files
pi-config/extensions/pi-crew/docs/research-phase11-distillation.md

12 KiB

Phase 10+ Deep Distillation — Round 2

Date: 2026-05-04 Sources: pi-mono v0.72.1 (324aa1d), pi-subagents v0.24.0 (3ee17de), pi-crew ref v1.0.14 (c0631a3)

Executive Summary

Sau khi deep-read lần 2 vào runtime internals của cả 3 repos, phát hiện 15 insights mới chưa được implement trong pi-crew. Phân thành 4 axes: Runtime Architecture, Extension API Adoption, Observability/Reliability, và Developer Experience.


Axis F: Runtime Architecture Alignment

F1. Process-Level Singleton for CrewRuntime

Source: pi-crew ref crew-runtime.ts Finding: Module-level singleton (export const crewRuntime = new CrewRuntime()) sống xuyên suốt process lifetime. Khi Pi thay extension instance (session switch), singleton vẫn tồn tại vì Node.js module cache. New extension instance chỉ cần gọi crewRuntime.activateSession(binding). Current pi-crew: Mỗi session tạo mới state. Chưa có survive-across-session mechanism. Action: Refactor SubagentManager thành process-level singleton với activateSession() pattern. In-flight child processes survive session switches.

F2. Fire-and-Forget Spawn với Immediate ID Return

Source: pi-crew ref crew-runtime.ts Finding: spawn() tạo state → return ID ngay lập tức → chạy spawnSession() async (fire-and-forget). Caller không block. Current pi-crew: runChildPi là async block. Task runner phải await. Action: Tách spawn thành sync ID allocation + async execution. Task runner fire-and-forget, poll status qua event log.

F3. Final Drain Window Pattern

Source: pi-subagents execution.ts Finding: Khi message_end với stopReason === "stop" và không có tool calls → start 1s grace timer → SIGTERM → 3s → SIGKILL. Giúp child process flush output cuối cùng. Current pi-crew: Child Pi timeout đơn giản, không có grace period sau completion signal. Action: Implement FINAL_STOP_GRACE_MS drain window trong child-pi.ts.

F4. Atomic JSON Writes cho Status Persistence

Source: pi-subagents async-execution.ts Finding: writeAtomicJson() ghi file temp → rename. Tránh torn writes khi process crash giữa chừng. Current pi-crew: JSON.stringify + writeFileSync trực tiếp — rủi ro torn write. Action: Implement writeAtomicJson() utility. Apply cho status.json, manifest writes.

F5. Two-Level Process Hierarchy cho Async

Source: pi-subagents subagent-runner.ts Finding: Orchestrator spawn runner (detached) → runner spawn Pi children. Runner track PIDs, write status.json. Orchestrator poll status.json. Current pi-crew: Async run chỉ fire background, không có intermediate runner process. Action: (Low priority) Xem xét thêm intermediate runner cho reliable async tracking.

F6. Stale Run Reconciler — Three-Phase Pattern

Source: pi-subagents stale-run-reconciler.ts Finding: 3-phase: (1) check result file exists → use it, (2) check PID liveness, (3) for dead PIDs → repair immediately, for alive PIDs → fail only if stale > 24h. Current pi-crew: Có crash-recovery.ts nhưng chưa có full 3-phase reconciliation. Action: Nâng cấp crash recovery với 3-phase pattern: result-check → PID-check → stale-threshold.


Axis G: Extension API Adoption

G1. session_before_compact Hook — Custom Compaction

Source: pi-mono extensions/types.ts Finding: Hook session_before_compact returns { cancel?, compaction?: CompactionResult }. Extensions có thể thay thế hoàn toàn compaction logic — bao gồm structured details (artifact indices, version markers). Đây là extensibility point mạnh nhất. Current pi-crew: compaction-guard.ts chỉ phát hiện compaction events, không can thiệp. Action: Implement session_before_compact handler để cung cấp structured compaction thay vì raw text summarization. Preserve team run state across compaction.

G2. session_before_switch Hook — Pre-Switch State Save

Source: pi-mono extensions/types.ts Finding: session_before_switch fires trước khi Pi switches session (new/resume). Return { cancel? }. Pi-crew có thể save in-memory state → file trước khi switch. Current pi-crew: Không hook vào session switch. State mất khi switch. Action: Hook session_before_switch để flush pending deliveries và save subagent state snapshot.

G3. resources_discover Hook — Dynamic Agent/Team Discovery

Source: pi-mono extensions/types.ts Finding: resources_discover event returns { additionalSkillPaths?, additionalPromptPaths?, additionalThemePaths? }. Extensions có thể dynamically inject resources. Current pi-crew: Discovery chỉ đọc từ filesystem. Không dynamic. Action: Hook resources_discover để inject team-specific skills/prompts dựa trên config. VD: auto-inject safe-bash skill cho projects có package.json.

G4. before_agent_start — System Prompt Override

Source: pi-mono extensions/types.ts Finding: Can inject message and/or override systemPrompt before agent loop begins. Powerful for child agents. Current pi-crew: Child Pi system prompt built từ task packet, không override qua hook. Action: (Low priority — already handled via task packet prompt builder)

G5. tool_result Event — Post-Execution Output Modification

Source: pi-mono extensions/types.ts Finding: Can modify tool output content, details, isError after execution. Useful for enrichment/filtering. Current pi-crew: Không hook vào tool results. Action: Hook tool_result cho team tool để enrich output với structured metadata (run URL, artifact count, duration).

G6. input Event — User Input Interception

Source: pi-mono extensions/types.ts Finding: Can transform user input text/images or fully handle it (action: "continue" | "transform" | "handled"). Current pi-crew: Không intercept user input. Action: Hook input để detect @team-name mentions → auto-route to team run.


Axis H: Observability & Reliability Gaps

H1. Completion Mutation Guard

Source: pi-subagents completion-guard.ts Finding: Sau khi subagent trả về "success", check xem nếu task là "implementation" nhưng không có file edits → mutate completion thành warning. Tránh false-positive completions. Current pi-crew: Task complete khi child Pi exits 0. Không verify actual work done. Action: Implement completion guard: verify artifacts exist, files changed, hoặc output non-trivial.

H2. Snapshot-Before-Emit Pattern

Source: pi-subagents execution.ts Finding: Progress object snapshotted (spread) trước mỗi onUpdate callback. Tránh mutation during callback. Current pi-crew: Task state mutated directly, events emit references. Action: Snapshot task state trước khi emit events để avoid race conditions.

H3. Intercom Bridge với Delivery Confirmation

Source: pi-subagents intercom-bridge.ts Finding: Bidirectional intercom: deliverSubagentResultIntercomEvent() emit event → wait for confirmation với 500ms timeout. Agent injection pattern: mutate config để add contact_supervisor tool + instructions. Current pi-crew: Có supervisor-contact.ts parse từ stdout, nhưng không có bidirectional confirmation. Action: Nếu Pi expose intercom API, upgrade supervisor contact thành bidirectional với delivery confirmation.

H4. writeAtomicJson Utility

Source: pi-subagents (pervasive) Finding: Atomic file writes used everywhere: status, manifest, results. Pattern: writeFileSync(path + ".tmp", data) → renameSync(path + ".tmp", path). Action: Shared utility trong src/utils/atomic-write.ts.


Axis I: Developer Experience

I1. Tool Presentation — Emoji + Grouping

Source: pi-crew ref tool-presentation.ts Finding: crew_spawn renders "🚀 Spawning {agent}...", crew_respond renders "💬 Sending response...". Grouped tool calls have custom collapse UI. Current pi-crew: Tool output plain text. Action: Add emoji prefixes và structured formatting cho tool output.

I2. renderCall/renderResult cho Team Tool

Source: pi-mono tools/index.ts Finding: ToolDefinition supports renderCallrenderResult callbacks returning TUI Components. Allows rich rendering in Pi terminal UI. Current pi-crew: Không có custom renderers. Action: Implement renderCall cho team tool để show spinner/agent-list thay vì raw JSON. Implement renderResult để show summary dashboard.

I3. Prompt Snippet + Guidelines trong Tool Definition

Source: pi-mono tools/index.ts Finding: promptSnippet — one-liner in system prompt. promptGuidelines — bullets appended to system prompt. Tools without promptSnippet are excluded from LLM awareness. Current pi-crew: Tool description chỉ trong JSON schema description. Action: Khi Pi hỗ trợ promptSnippet/promptGuidelines trong custom tools, adopt để improve LLM tool usage.


Priority Matrix

ID Feature Impact Effort Priority
F1 Process-level singleton High High P1
F2 Fire-and-forget spawn Medium Medium P2
F3 Final drain window Medium Low P2
F4 Atomic JSON writes High Low P1
F5 Two-level async hierarchy Low High P3
F6 3-phase stale reconciliation Medium Medium P2
G1 Custom compaction hook High Medium P1
G2 Pre-switch state save Medium Low P2
G3 Dynamic resource discovery High Medium P1
G4 System prompt override Low Low P3
G5 Post-execution output mod Low Low P3
G6 User input interception Medium Medium P3
H1 Completion mutation guard High Low P1
H2 Snapshot-before-emit Medium Low P2
H3 Bidirectional intercom Medium High P3
H4 writeAtomicJson utility High Low P1
I1 Tool presentation emojis Low Low P3
I2 Custom TUI renderers High High P2 (when API available)
I3 Prompt snippet/guidelines Medium Low P3 (when API available)

Phase 11a: Reliability Foundations (F4 + H4 + H1 + H2)

  • src/utils/atomic-write.ts — writeAtomicJson utility
  • Apply atomic writes to all manifest/state writes
  • Completion mutation guard for task results
  • Snapshot-before-emit for task state events

Phase 11b: Extension API Hooks (G1 + G2 + G3)

  • session_before_compact handler — structured compaction
  • session_before_switch handler — pre-switch state flush
  • resources_discover handler — dynamic skill/prompt injection

Phase 11c: Runtime Architecture (F1 + F2 + F3)

  • Refactor SubagentManager → process-level singleton
  • Fire-and-forget spawn pattern
  • Final drain window for child process cleanup

Phase 11d: Reconciliation & Recovery (F6 + H3)

  • 3-phase stale run reconciliation
  • Upgrade supervisor contact toward bidirectional (if API available)

Already Implemented (Phase 10a-10d)

  • DeliveryCoordinator (session-aware routing with queue/flush)
  • OverflowRecoveryTracker (compaction → retry state machine)
  • Foreign-aware cancel (ownership detection)
  • Session resource cleanup adapter
  • Interactive subagent waiting state + respond action
  • Supervisor contact parsing from child stdout
  • Parent model inheritance
  • Session-scoped run listing
  • Observability metrics for overflow/waiting/supervisor
  • Skills override + .pi/pi-crew.json config path