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
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:
@@ -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) => {
|
||||
|
||||
@@ -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
|
||||
})),
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user