fix: resolve 17 P2 defects and 5 P3 defects from pre-launch audit
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

Batch fix covering multiple modules:
- P2-01: HandRegistry Semaphore-based max_concurrent enforcement
- P2-03: Populate toolCount/metricCount from Hand trait methods
- P2-06: heartbeat_update_config minimum interval validation
- P2-07: ReflectionResult used_fallback marker for rule-based fallback
- P2-08/09: identity_propose_change parameter naming consistency
- P2-10: ClassroomMetadata is_placeholder flag for LLM failure
- P2-11: classroomStore userDidCloseDuringGeneration intent tracking
- P2-12: workflowStore pipeline_create sends actionType
- P2-13/14: PipelineInfo step_count + PipelineStepInfo for proper step mapping
- P2-15: Pipe transform support in context.resolve (8 transforms)
- P2-16: Mustache {{...}} → \${...} auto-normalization
- P2-17: SaaSLogin password placeholder 6→8
- P2-19: serialize_skill_md + update_skill preserve tools field
- P2-22: ToolOutputGuard sensitive patterns from warn→block
- P2-23: Mutex::unwrap() → unwrap_or_else in relay/service.rs
- P3-01/03/07/08/09: Various P3 fixes
- DEFECT_LIST.md: comprehensive status sync (43/51 fixed, 8 remaining)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-04-06 00:49:16 +08:00
parent f9e1ce1d6e
commit 26a833d1c8
25 changed files with 408 additions and 143 deletions

View File

@@ -59,6 +59,8 @@ export interface ClassroomState {
activeClassroom: Classroom | null;
/** Whether the ClassroomPlayer overlay is open */
classroomOpen: boolean;
/** P2-11: Tracks if user explicitly closed player during generation */
userDidCloseDuringGeneration: boolean;
/** Chat messages for the active classroom */
chatMessages: ClassroomChatMessage[];
/** Whether chat is loading */
@@ -93,6 +95,7 @@ export const useClassroomStore = create<ClassroomStore>()((set, get) => ({
generatingTopic: null,
activeClassroom: null,
classroomOpen: false,
userDidCloseDuringGeneration: false,
chatMessages: [],
chatLoading: false,
error: null,
@@ -105,6 +108,7 @@ export const useClassroomStore = create<ClassroomStore>()((set, get) => ({
progressActivity: 'Starting generation...',
generatingTopic: request.topic,
error: null,
userDidCloseDuringGeneration: false,
});
// Listen for progress events from Rust
@@ -121,7 +125,10 @@ export const useClassroomStore = create<ClassroomStore>()((set, get) => ({
const result = await invoke<GenerationResult>('classroom_generate', { request });
set({ generating: false });
await get().loadClassroom(result.classroomId);
set({ classroomOpen: true });
// P2-11: Only auto-open if user hasn't explicitly closed during generation
if (!get().userDidCloseDuringGeneration) {
set({ classroomOpen: true });
}
return result.classroomId;
} catch (e) {
const msg = e instanceof Error ? e.message : String(e);
@@ -161,7 +168,11 @@ export const useClassroomStore = create<ClassroomStore>()((set, get) => ({
},
closeClassroom: () => {
set({ classroomOpen: false });
set({
classroomOpen: false,
// P2-11: Track explicit user close during generation
userDidCloseDuringGeneration: get().generating,
});
},
sendChatMessage: async (message, sceneContext) => {

View File

@@ -47,6 +47,8 @@ export interface WorkflowStep {
name?: string;
params?: Record<string, unknown>;
condition?: string;
/** P2-12: Action type for pipeline step (hand, llm_generate, parallel, condition) */
actionType?: string;
}
export interface WorkflowDetail {
@@ -341,6 +343,8 @@ interface PipelineInfo {
icon: string;
version: string;
author: string;
/** P2-13: Step count from backend */
stepCount?: number;
inputs: Array<{
name: string;
inputType: string;
@@ -386,7 +390,7 @@ function createWorkflowClientFromKernel(_client: KernelClient): WorkflowClient {
workflows: pipelines.map((p) => ({
id: p.id,
name: p.displayName || p.id,
steps: p.inputs.length,
steps: p.stepCount ?? p.inputs?.length ?? 0, // P2-13: Use stepCount from backend
description: p.description,
createdAt: undefined,
})),
@@ -424,6 +428,7 @@ function createWorkflowClientFromKernel(_client: KernelClient): WorkflowClient {
name: s.name || `Step ${i + 1}`,
params: s.params,
condition: s.condition,
actionType: s.actionType, // P2-12: Send actionType to backend
})),
},
});
@@ -444,6 +449,7 @@ function createWorkflowClientFromKernel(_client: KernelClient): WorkflowClient {
name: s.name || `Step ${i + 1}`,
params: s.params,
condition: s.condition,
actionType: s.actionType, // P2-12: Send actionType to backend
})),
},
});