1---
2name: meta-kid-project-planner
3visibility: tombstone
4invocation: historical_only
5description: "Retired compatibility definition for historical meta-kid-project-planner runs. It is not available for discovery, automatic activation, or new invocation; its plan remains bundled only so persisted and in-flight run snapshots can be inspected, resumed, or replayed safely."
6description_zh: "为历史 meta-kid-project-planner 运行保留的兼容定义。它不参与发现、自动激活或新调用;计划继续内置,仅用于安全检查、恢复或重放已持久化及正在运行的快照。"
7kind: meta
8meta_priority: 60
9always: false
10user-invocable: false
11disable-model-invocation: true
12final_text_mode: "step:project_pack_audit"
13request_template:
14 outcome: "Age-appropriate project plan with materials, safety notes, and guardian guidance."
15 outcome_zh: "适合孩子年龄的项目计划,包含材料、安全提示和家长指导。"
16 outcome_en: "Age-appropriate project plan with materials, safety notes, and guardian guidance."
17 fields:
18 - name: project_topic
19 label_zh: "项目主题"
20 label_en: "Project topic"
21 required: true
22 - name: age_band
23 label_zh: "年龄段"
24 label_en: "Age band"
25 required: false
26 default: "early grade"
27 default_zh: "小学低年级"
28 default_en: "early grade"
29 - name: deadline_days
30 label_zh: "截止天数"
31 label_en: "Days until due"
32 required: false
33 - name: budget_or_material_constraints
34 label_zh: "预算或材料限制"
35 label_en: "Budget or material constraints"
36 required: false
37 - name: audience
38 label_zh: "受众"
39 label_en: "Audience"
40 required: false
41 default: "child plus guardian"
42 default_zh: "孩子和监护人"
43 default_en: "child plus guardian"
44 - name: language
45 label_zh: "输出语言"
46 label_en: "Output language"
47 required: false
48 default: "match the user's language"
49 default_zh: "跟随用户语言"
50 default_en: "match the user's language"
51 assumptions:
52 - "Refuse unsafe or age-inappropriate projects."
53 - "Default to modest materials and light guardian supervision when unspecified."
54 assumptions_zh:
55 - "拒绝不安全或不适合年龄的项目。"
56 - "未说明时,默认使用适度材料并安排轻量家长监督。"
57 assumptions_en:
58 - "Refuse unsafe or age-inappropriate projects."
59 - "Default to modest materials and light guardian supervision when unspecified."
60output_contract:
61 append_to_final_text: false
62 required_sections:
63 - "Feasibility verdict"
64 - "Step-by-step plan"
65 - "Materials and substitutions"
66 - "Safety notes"
67 - "Guardian learning objectives"
68 assumptions:
69 - "Age band and supervision level may be defaulted when absent."
70 unverified:
71 - "Local material availability and school-specific rubric details."
72 artifacts:
73 - name: "project_pack"
74 required: false
75eval_prompts:
76 - name: "kid-project-baseline"
77 prompt: "Plan a safe age-appropriate science fair project for an elementary-school child with a small budget."
78 rubric:
79 - "Feasibility verdict"
80 - "Step-by-step plan"
81 - "Materials and substitutions"
82 - "Safety notes"
83 - "Guardian learning objectives"
84preference_keys:
85 - preferred_language
86 - guardian_supervision_level
87policy_tags:
88 - child-safety
89 - age-appropriate
90triggers: []
91provenance:
92 origin: opensquilla-original
93 license: Apache-2.0
94metadata:
95 opensquilla:
96 risk: medium
97 capabilities: [network, filesystem-write]
98 clawhub_top100_composition:
99 - skill: "Multi Search Engine"
100 local_skill: multi-search-engine
101 rank_source: "Top ClawHub Skills downloads top100, 2026-05-28"
102 rank: 11
103 role: "Find safe, age-appropriate how-to references and material alternatives."
104 - skill: "Weather"
105 local_skill: weather
106 rank_source: "Top ClawHub Skills downloads top100, 2026-05-28"
107 role: "Plan outdoor child projects around realistic weather constraints."
108 - skill: "Deep Researcher / deep research family"
109 local_skill: deep-research
110 rank_source: "ClawHub research-skill family, verified via current search results"
111 role: "Add extra safety and feasibility research when the project is more complex."
112 - skill: "PowerPoint / PPTX"
113 local_skill: pptx
114 rank_source: "Top ClawHub Skills downloads top100, 2026-05-28"
115 role: "Produce kid-facing printable step cards or a simple presentation when requested."
116composition:
117 steps:
118 - id: preferences
119 label: "偏好提取"
120 label_en: "Preference extraction"
121 kind: llm_chat
122 with:
123 system: "You extract kid-project preferences. Return only the requested contract. Refuse to plan projects that are clearly unsafe (firearms, fireworks, drugs, sharp-weapon making, etc.) by setting PROJECT_SAFE: no."
124 task: |
125 Extract the kid-project brief.
126
127 User request:
128 {{ inputs.user_message | xml_escape | truncate(1600) }}
129
130 Clarification policy:
131 - If the request already includes a project topic, child age or age
132 band, and deadline or rough time window, set
133 NEEDS_CLARIFICATION: no and MISSING_FIELDS: none.
134 - Budget, exact presentation format, exact weather, and exact
135 sunshine direction can remain explicitly unknown assumptions; do
136 not block on them and do not invent precise values.
137 - For common school projects, proceed with explicit assumptions or
138 UNKNOWN markers instead of asking a form unless safety or the core
139 topic is unclear.
140
141 Return exactly:
142 TOPIC: <short project description>
143 AGE_BAND: <PRE_K|EARLY_GRADE|TWEEN|TEEN|UNKNOWN>
144 DEADLINE_DAYS: <integer days until due, or UNKNOWN>
145 BUDGET_BAND: <SHOESTRING|MODEST|COMFORTABLE|UNKNOWN>
146 PARENT_SUPERVISION: <SOLO|LIGHT|HANDS_ON|UNKNOWN>
147 LANGUAGE: <en|zh|mixed>
148 PROJECT_SAFE: <yes|no>
149 UNSAFE_REASON: <one phrase if PROJECT_SAFE is no, else none>
150 NEEDS_CLARIFICATION: <yes|no>
151 MISSING_FIELDS:
152 - <topic|age_band|deadline|none>
153 ASSUMPTIONS:
154 - <assumption>
155 - id: project_clarify
156 label: "项目澄清"
157 label_en: "Project clarification"
158 kind: user_input
159 depends_on: [preferences]
160 when: "'NEEDS_CLARIFICATION: yes' in outputs.preferences and 'PROJECT_SAFE: yes' in outputs.preferences and 'MISSING_FIELDS:\n - none' not in outputs.preferences"
161 clarify:
162 mode: form
163 intro: |
164 再确认几件事,然后给你完整的项目规划(含家长版) / A few details and I'll build the kid + parent pack.
165 intro_zh: "再确认几件事,然后给你完整的项目规划(含家长版)。"
166 intro_en: "A few details and I will build the kid plus guardian project pack."
167 nl_extract: true
168 fields:
169 - name: topic
170 type: string
171 required: true
172 prompt: "项目主题(如:做一座火山模型)/ Project topic"
173 prompt_zh: "项目主题(例如:做一座火山模型)"
174 prompt_en: "Project topic"
175 max_chars: 200
176 - name: age_band
177 type: enum
178 required: true
179 choices: [PRE_K, EARLY_GRADE, TWEEN, TEEN]
180 prompt: "孩子年龄段 / Child age band (PRE_K = 3-5, EARLY_GRADE = 6-9, TWEEN = 10-12, TEEN = 13-17)"
181 prompt_zh: "孩子年龄段(PRE_K=3-5 岁,EARLY_GRADE=6-9 岁,TWEEN=10-12 岁,TEEN=13-17 岁)"
182 prompt_en: "Child age band (PRE_K = 3-5, EARLY_GRADE = 6-9, TWEEN = 10-12, TEEN = 13-17)"
183 - name: deadline_days
184 type: int
185 min: 0
186 max: 365
187 default: 14
188 prompt: "几天后要交(0 = 今天,14 = 两周)/ Days until due"
189 prompt_zh: "几天后要交(0 = 今天,14 = 两周)"
190 prompt_en: "Days until due"
191 - name: budget_band
192 type: enum
193 choices: [SHOESTRING, MODEST, COMFORTABLE]
194 default: MODEST
195 prompt: "预算 / Budget"
196 prompt_zh: "预算"
197 prompt_en: "Budget"
198 - name: parent_supervision
199 type: enum
200 choices: [SOLO, LIGHT, HANDS_ON]
201 default: LIGHT
202 prompt: "家长参与程度(SOLO 几乎不参与;LIGHT 偶尔帮一下;HANDS_ON 全程在旁)/ Parent supervision"
203 prompt_zh: "家长参与程度(SOLO 几乎不参与;LIGHT 偶尔帮一下;HANDS_ON 全程在旁)"
204 prompt_en: "Parent supervision (SOLO = mostly independent; LIGHT = occasional help; HANDS_ON = close supervision)"
205 - name: language
206 type: enum
207 choices: [en, zh, mixed]
208 default: mixed
209 prompt: "输出语言 / Language"
210 prompt_zh: "输出语言"
211 prompt_en: "Output language"
212 cancel_keywords: ["算了", "换个项目", "cancel", "stop"]
213 timeout_hours: 48
214 - id: feasibility
215 label: "可行性"
216 label_en: "Feasibility"
217 kind: llm_classify
218 depends_on: [preferences, project_clarify]
219 output_choices:
220 - STRAIGHTFORWARD
221 - NEEDS_ADULT_HELP
222 - NEEDS_SHOPPING
223 - SAFETY_REVIEW_REQUIRED
224 - INAPPROPRIATE
225 with:
226 text: |
227 Classify project feasibility for this child.
228
229 Topic: from preferences / clarify.
230 Preferences:
231 {{ outputs.get('preferences', '') | truncate(800) }}
232 Clarification:
233 {{ inputs.get('collected', {}).get('project_clarify', {}) | tojson }}
234
235 Decision rules:
236 - INAPPROPRIATE: project involves weapons, fire without
237 supervision possibility, drugs, harmful chemistry,
238 self-harm-adjacent themes, or other clearly unsafe topics
239 for any minor.
240 - SAFETY_REVIEW_REQUIRED: project involves heat (small stove,
241 soldering iron), sharp blades (X-Acto knives), electronics
242 with mains voltage, or moderately reactive chemistry. Adult
243 must be present.
244 - NEEDS_SHOPPING: project requires materials the household
245 likely does not have (specific kit, model rocket motor,
246 specialty paint).
247 - NEEDS_ADULT_HELP: project is age-appropriate but a step
248 requires hands the child does not yet have (cutting balsa
249 wood for a 6-year-old, threading a needle for a 4-year-old).
250 - STRAIGHTFORWARD: child can complete the bulk of the project
251 with the declared PARENT_SUPERVISION level.
252 - id: redirect_unsafe
253 label: "安全改写"
254 label_en: "Safety rewrite"
255 kind: llm_chat
256 depends_on: [preferences, feasibility]
257 when: "'PROJECT_SAFE: no' in outputs.preferences or outputs.feasibility == 'INAPPROPRIATE'"
258 with:
259 system: "You write a gentle, non-shaming redirect when a project topic is unsafe or inappropriate. Always offer 3 alternative project ideas that are in the same SPIRIT as the original (curiosity-driven, hands-on, age-appropriate)."
260 task: |
261 Topic the user asked for:
262 {{ inputs.user_message | xml_escape | truncate(400) }}
263
264 Unsafe reason (from preferences):
265 {{ outputs.get('preferences', '') | truncate(400) }}
266
267 Write:
268 1. One sentence acknowledging the curiosity behind the
269 original idea (do not lecture).
270 2. One sentence explaining gently why this version isn't a
271 good kid project (concrete, not vague).
272 3. Three alternative project ideas that scratch a similar
273 itch but are safe and age-appropriate. Each: one-line
274 topic + one-line "what the kid will learn / make".
275
276 Language: match preferences (default zh).
277 End with a single line:
278 UNSAFE_REDIRECT: yes
279 - id: recall_past_projects
280 label: "项目召回"
281 label_en: "Project recall"
282 kind: tool_call
283 tool: memory_search
284 tool_allowlist: [memory_search]
285 depends_on: [feasibility, project_clarify]
286 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
287 on_failure: recall_past_projects_fallback
288 tool_args:
289 query: "child project prior projects preferences constraints {{ outputs.get('preferences', '') | truncate(600) }} {{ inputs.user_message | xml_escape | truncate(600) }}"
290 max_results: 6
291 source: memory
292 - id: recall_past_projects_fallback
293 label: "项目召回兜底"
294 label_en: "Project recall fallback"
295 kind: llm_chat
296 with:
297 system: "You produce a no-memory fallback note for child project planning."
298 task: |
299 No durable project memory was read. Continue using only the pasted
300 child age, deadline, materials, budget, supervision, location, and
301 project context. Do not mention runtime errors to the user.
302 - id: web_research
303 label: "网页研究"
304 label_en: "Web research"
305 kind: skill_exec
306 skill: multi-search-engine
307 depends_on: [feasibility]
308 when: "outputs.feasibility in ['STRAIGHTFORWARD', 'NEEDS_ADULT_HELP', 'NEEDS_SHOPPING', 'SAFETY_REVIEW_REQUIRED']"
309 on_failure: web_research_fallback
310 with:
311 query: "{{ inputs.get('collected', {}).get('project_clarify', {}).get('topic', '') }} {{ outputs.get('preferences', '') | truncate(160) }} {{ inputs.user_message | xml_escape | truncate(160) }} kid science project step-by-step instructions safe"
312 engines: [brave, tavily, duckduckgo]
313 max_results: 8
314 - id: web_research_fallback
315 label: "网页研究兜底"
316 label_en: "Web research fallback"
317 kind: llm_chat
318 with:
319 system: "You produce a no-web fallback note for child project planning."
320 task: |
321 Web research was not available. Extract the project topic, age,
322 deadline, materials, budget, parent availability, location, light,
323 weather-sensitive constraints, and safety needs only from the pasted
324 request. Do not expose tool names, paths, stack traces, connector
325 wording, or runtime failures.
326
327 Request:
328 {{ inputs.user_message | xml_escape | truncate(3500) }}
329 - id: weather_check
330 label: "天气检查"
331 label_en: "Weather check"
332 kind: skill_exec
333 skill: weather
334 depends_on: [feasibility, project_clarify]
335 when: "outputs.feasibility != 'INAPPROPRIATE' and ('outdoor' in (inputs.user_message | lower) or 'balcony' in (inputs.user_message | lower) or 'plant' in (inputs.user_message | lower) or 'garden' in (inputs.user_message | lower) or 'park' in (inputs.user_message | lower) or '户外' in inputs.user_message or '阳台' in inputs.user_message or '植物' in inputs.user_message or '豆芽' in inputs.user_message)"
336 on_failure: weather_check_fallback
337 with:
338 location: "{{ inputs.user_message | xml_escape | truncate(60) }}"
339 days: 7
340 - id: weather_check_fallback
341 label: "天气兜底"
342 label_en: "Weather fallback"
343 kind: llm_chat
344 with:
345 system: "You produce a no-live-weather fallback note for child project planning."
346 task: |
347 Live weather was not verified. Continue using only the pasted
348 location and the user's supplied light/outdoor/indoor context. Do not
349 infer forecasts, temperature ranges, rainfall, balcony direction,
350 sunshine hours, or season-specific claims. Do not mention tool
351 failures.
352
353 Request:
354 {{ inputs.user_message | xml_escape | truncate(2000) }}
355 - id: project_fact_ledger
356 label: "项目事实台账"
357 label_en: "Project fact ledger"
358 kind: llm_chat
359 depends_on: [preferences, project_clarify, recall_past_projects, weather_check]
360 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
361 with:
362 system: "You extract a strict source-fact ledger for a child project plan. You do not write the plan. You separate user-provided facts, durable memory facts, unknowns, and unsafe or unsupported inferences."
363 task: |
364 Build a strict project fact ledger from the user's request and any
365 clarification payload. Durable memory is also a source of facts when
366 the memory output clearly states child profile, prior projects,
367 preferences, or parent availability. Ignore memory status prose,
368 file inventory, workspace paths, and runtime/tool wording; extract
369 only the actual remembered facts.
370
371 User request:
372 {{ inputs.user_message | xml_escape | truncate(3500) }}
373
374 Clarification:
375 {{ inputs.get('collected', {}).get('project_clarify', {}) | tojson | truncate(1200) }}
376
377 Durable memory / past-project recall:
378 {{ outputs.get('recall_past_projects', '') | truncate(1800) }}
379
380 Weather result or fallback:
381 {{ outputs.get('weather_check', '') | truncate(800) }}
382
383 Return exactly:
384 OUTPUT_LANGUAGE: <zh|en|mixed>
385 PROVIDED_CHILD_CONTEXT:
386 - <age, ability, child preferences, guardian availability, or UNKNOWN>
387 PROVIDED_MEMORY_CONTEXT:
388 - <remembered child profile, prior projects, parent constraints, lessons learned, or none>
389 PROVIDED_PROJECT_CONTEXT:
390 - <topic, school deadline/time window, school output, or UNKNOWN>
391 PROVIDED_MATERIALS_BUDGET:
392 - <available materials and budget exactly as supplied, or UNKNOWN>
393 PROVIDED_LOCATION_LIGHT:
394 - <location and light exactly as supplied, or UNKNOWN>
395 VERIFIED_WEATHER:
396 - <verified forecast if actually present in weather result, else none>
397 UNKNOWN_DETAILS:
398 - <exact date, balcony direction, exact weather, exact school format, etc.>
399 FORBIDDEN_INFERENCES:
400 - <details that must not appear as facts, e.g. exact calendar date,
401 balcony faces south/east/west, temperature range, rain forecast,
402 school rule, allergy, fake measurements, tasting/eating>
403
404 Rules:
405 - If durable memory says the child is a specific age, likes/dislikes
406 an activity style, has prior projects, or has parent time limits,
407 put those in PROVIDED_CHILD_CONTEXT and PROVIDED_MEMORY_CONTEXT.
408 Do not mark them UNKNOWN.
409 - If the current request asks not to repeat previous projects, list
410 remembered prior projects in PROVIDED_MEMORY_CONTEXT so downstream
411 steps can avoid them explicitly.
412 - If the source says only "two weeks later", mark exact date UNKNOWN.
413 - If the source says only "half-day sun", mark orientation and hours
414 UNKNOWN. Preserve "half-day sun" exactly.
415 - If weather was not actually verified, VERIFIED_WEATHER must be none.
416 - Never invent sample measurements, dates, allergies, school rules,
417 or local forecasts.
418 - id: deep_research
419 label: "深度研究"
420 label_en: "Deep research"
421 kind: skill_exec
422 skill: deep-research
423 depends_on: [feasibility]
424 when: "outputs.feasibility in ['SAFETY_REVIEW_REQUIRED', 'NEEDS_SHOPPING']"
425 with:
426 query: "{{ inputs.get('collected', {}).get('project_clarify', {}).get('topic', '') }} safe materials children"
427 depth: "standard"
428 max_rounds: 1
429 - id: outline_steps
430 label: "步骤大纲"
431 label_en: "Step outline"
432 kind: llm_chat
433 depends_on: [feasibility, web_research, recall_past_projects, weather_check, project_clarify, preferences]
434 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
435 with:
436 system: "You break a project into kid-sized steps. Each step takes 5-20 minutes for an unhurried child. No step requires reading more than a paragraph. Use concrete, doable verbs."
437 task: |
438 Build a step-by-step plan grounded in the topic and research.
439
440 Topic + context:
441 {{ outputs.get('preferences', '') | truncate(500) }}
442 {{ inputs.get('collected', {}).get('project_clarify', {}) | tojson }}
443 If clarification fields are empty, extract topic, age, deadline,
444 budget, materials, parent availability, location, and light from the
445 user request:
446 {{ inputs.user_message | xml_escape | truncate(2500) }}
447
448 Past projects this child has done (avoid repeats; build on prior learning):
449 {{ outputs.get('recall_past_projects', '') | truncate(600) }}
450
451 Weather (for outdoor projects — pick a good day):
452 {{ outputs.get('weather_check', '') | truncate(400) }}
453
454 Web research:
455 {{ outputs.get('web_research', '') | truncate(2500) }}
456
457 Deep research (only present if research happened):
458 {{ outputs.get('deep_research', '') | truncate(2000) }}
459
460 Deadline: {{ inputs.get('collected', {}).get('project_clarify', {}).get('deadline_days', 14) }} days.
461 Age band: {{ inputs.get('collected', {}).get('project_clarify', {}).get('age_band', 'EARLY_GRADE') }}.
462 Parent supervision: {{ inputs.get('collected', {}).get('project_clarify', {}).get('parent_supervision', 'LIGHT') }}.
463
464 Output a markdown numbered list. Each step has:
465 - Title (one short sentence, kid-readable verb-first)
466 - Time estimate (5-20 min)
467 - Adult-needed: yes / no (be honest)
468 - One supportive sentence ("You'll get to ...")
469
470 Distribute the steps across the available days. If deadline is
471 tight, mark which steps to skip or shorten.
472
473 Language: match preferences (default mixed).
474 - id: material_list
475 label: "材料清单"
476 label_en: "Materials list"
477 kind: llm_chat
478 depends_on: [outline_steps, project_clarify, web_research]
479 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
480 with:
481 system: "You list materials needed for a kid project. For each material, offer a SHOESTRING substitute the family likely has at home. Always be honest when a substitute genuinely won't work."
482 task: |
483 List materials needed.
484
485 Step plan:
486 {{ outputs.outline_steps | truncate(2500) }}
487
488 Budget band: {{ inputs.get('collected', {}).get('project_clarify', {}).get('budget_band', 'MODEST') }}.
489
490 Output a markdown table with columns:
491 item | quantity | est_cost | shoestring_substitute |
492 notes_if_substitute_changes_outcome.
493
494 Add at the end a bullet line "Likely you have at home:" listing
495 items the household probably already owns.
496 - id: safety_notes
497 label: "安全提示"
498 label_en: "Safety notes"
499 kind: llm_chat
500 depends_on: [feasibility, outline_steps, project_clarify]
501 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
502 with:
503 system: "You surface safety considerations for a kid project. Be specific (not generic 'be careful'). Tailor to the age band. If feasibility says SAFETY_REVIEW_REQUIRED, the safety section is the most important part of the deliverable."
504 task: |
505 Surface safety notes specific to this project.
506
507 Feasibility: {{ outputs.feasibility }}
508 Age band: {{ inputs.get('collected', {}).get('project_clarify', {}).get('age_band', 'EARLY_GRADE') }}.
509 Step plan (for reference):
510 {{ outputs.outline_steps | truncate(2000) }}
511
512 Output bullet points grouped under:
513 ## ⚠️ Adult must be present for
514 ## ✋ Stop and call an adult if
515 ## 🧪 Materials to handle carefully
516
517 Each bullet must reference a specific step from the plan (e.g.
518 "Step 4 (mixing): vinegar can spray — wear safety glasses or
519 old sunglasses").
520
521 If feasibility is STRAIGHTFORWARD and the child is TWEEN+,
522 keep this section short (3-5 bullets). If SAFETY_REVIEW_REQUIRED
523 or younger child, be thorough (8-12 bullets).
524
525 Language: match preferences (default mixed).
526 - id: learning_objectives
527 label: "学习目标"
528 label_en: "Learning goals"
529 kind: llm_chat
530 depends_on: [outline_steps, preferences, project_clarify]
531 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
532 with:
533 system: "You write the parent-facing learning-objective section. This is what the GUARDIAN reads to know what their child is actually getting out of the project beyond the artifact."
534 task: |
535 Write the parent-facing learning objectives.
536
537 Topic + step plan:
538 {{ outputs.get('preferences', '') | truncate(400) }}
539 {{ outputs.outline_steps | truncate(2500) }}
540
541 Output:
542 ## 👀 What your kid will actually learn
543
544 3-5 bullets, each one concrete learning outcome grounded in a
545 specific step. Avoid generic outcomes like "creativity" or
546 "problem-solving" — name the specific concept (e.g. "How an
547 acid-base reaction releases CO2 — they'll see the bubbling
548 slowdown when vinegar runs out").
549
550 ## 🧠 Conversation prompts during/after
551 3 questions the parent can ask the child to deepen the
552 learning. Each question must be open-ended.
553
554 Language: match preferences (parent-facing — usually adult
555 register).
556 - id: kid_deck
557 label: "儿童卡片"
558 label_en: "Child card"
559 kind: skill_exec
560 skill: pptx
561 depends_on: [outline_steps, material_list, safety_notes, project_clarify, feasibility]
562 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences and inputs.get('collected', {}).get('project_clarify', {}).get('parent_supervision', 'LIGHT') == 'HANDS_ON'"
563 with:
564 mode: create
565 title: "🛠️ {{ inputs.get('collected', {}).get('project_clarify', {}).get('topic', 'Your project') }}"
566 slides:
567 - title: "What we're going to make"
568 body: "{{ outputs.get('preferences', '') | truncate(400) }}"
569 - title: "What you need (materials)"
570 body: "{{ outputs.get('material_list', '') | truncate(800) }}"
571 - title: "Step-by-step plan"
572 body: "{{ outputs.get('outline_steps', '') | truncate(1200) }}"
573 - title: "⚠️ Stop and call grown-up if"
574 body: "{{ outputs.get('safety_notes', '') | truncate(600) }}"
575 output_path: "kid_project_{{ inputs.get('collected', {}).get('project_clarify', {}).get('topic', 'untitled') | slugify }}.pptx"
576 - id: vocab_cards
577 label: "词汇卡"
578 label_en: "Vocabulary card"
579 kind: llm_chat
580 depends_on: [outline_steps, material_list, project_clarify, feasibility, preferences]
581 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences and ('vocab' in (inputs.user_message | lower) or 'word card' in (inputs.user_message | lower) or 'bilingual' in (inputs.user_message | lower) or '英语' in inputs.user_message or '双语' in inputs.user_message or '单词' in inputs.user_message)"
582 with:
583 system: "You produce a small vocabulary card list grounded in the project content. Each card is age-appropriate."
584 task: |
585 Produce 6 vocab cards from the project content.
586
587 Step plan:
588 {{ outputs.outline_steps | truncate(2000) }}
589
590 Materials:
591 {{ outputs.material_list | truncate(800) }}
592
593 Age band: {{ inputs.get('collected', {}).get('project_clarify', {}).get('age_band', 'EARLY_GRADE') }}.
594
595 For each card:
596 - Term (one English word + one Chinese gloss if the language
597 preference is `mixed`)
598 - Kid-friendly definition (one sentence)
599 - Example sentence from the project ("In step 3, the vinegar
600 ACID meets the baking soda BASE...")
601
602 Output as a markdown numbered list.
603 - id: deliver_project_pack
604 label: "项目包交付"
605 label_en: "Project package delivery"
606 kind: llm_chat
607 depends_on:
608 - preferences
609 - feasibility
610 - redirect_unsafe
611 - outline_steps
612 - material_list
613 - safety_notes
614 - learning_objectives
615 - vocab_cards
616 - kid_deck
617 - recall_past_projects
618 - weather_check
619 - project_fact_ledger
620 - project_clarify
621 with:
622 system: "You assemble the final project pack the user will read. Return the complete deliverable inline in chat. Do not create, save, export, attach, or point primarily to an artifact unless the user explicitly asked for a file export with words like PDF, file, export, attachment, or download. Treat requests for a printable worksheet, printable record sheet, or poster layout as print-ready markdown included inline. Never mention workflow, meta-skill, tool names, connector failures, workspace paths, or runtime details."
623 task: |
624 Assemble the final project pack.
625
626 If the project was unsafe (redirect_unsafe ran), output ONLY
627 the content of {{ outputs.get('redirect_unsafe', '') }} verbatim
628 and end with PACK_DELIVERED: no_safety_redirect — nothing else.
629
630 Otherwise, synthesize a concise, non-duplicative project pack.
631 do not copy intermediate outputs verbatim when that would repeat
632 safety text, parent instructions, or child instructions. Use the
633 intermediate outputs as source material and rewrite them into one
634 practical final answer.
635
636 Original user request:
637 {{ inputs.user_message | xml_escape | truncate(3500) }}
638
639 Project fact ledger:
640 {{ outputs.get('project_fact_ledger', '') | truncate(2500) }}
641
642 Durable memory / past-project recall:
643 {{ outputs.get('recall_past_projects', '') | truncate(1600) }}
644
645 Source-constraint audit:
646 - Treat the Project fact ledger as the source of truth. If an
647 intermediate step conflicts with it, ignore the intermediate step.
648 - Treat PROVIDED_MEMORY_CONTEXT in the fact ledger as user-relevant
649 durable context. Preserve remembered age, child preferences, parent
650 time limits, prior projects, and lessons learned unless the current
651 request explicitly contradicts them.
652 - If the fact ledger marks a detail UNKNOWN, leave it unknown or mark
653 it as an assumption; do not fill it with common sense or current
654 date/time.
655 - Preserve every explicit user constraint before adding suggestions:
656 age, deadline, location, available materials, budget,
657 parent time, light/weather constraints, school deliverable, and
658 requested output sections.
659 - Do not replace user-provided materials with unrelated materials.
660 Prefer the user's materials first, then list substitutes only as
661 backups.
662 - Do not invent calendar dates, school dates, temperature readings,
663 weather forecasts, or live conditions. Use day numbers or say the
664 exact date is unknown unless the user supplied one or live data was
665 verified.
666 - If the user gives only a relative deadline such as "two weeks
667 later", do not convert it into a calendar date. Say "两周后 /
668 relative deadline supplied; exact date not provided" and schedule
669 by Day 1...Day 14.
670 - Do not invent balcony direction, temperature ranges, sunshine
671 hours, rain forecasts, school rules, allergies, or local weather.
672 Keep weather/light claims to what the user supplied plus clearly
673 labelled assumptions.
674 - Do not prefill observation tables with fake measurements, fake
675 dates, or predicted heights. For templates, leave measurement cells blank or as placeholders
676 such as "__ cm" / "[记录]".
677 - Do not suggest tasting or eating the experiment materials unless
678 the user explicitly asks for an edible-food activity and safety has
679 been reviewed. Observation projects should compare appearance,
680 height, color, firmness by sight/touch if safe, and drawings.
681 - Design a comparison experiment when it fits the project and stays
682 within the user's materials, age, time budget, and safety limits.
683 For observation projects, make the variable, control, and data table
684 clear enough for a school presentation.
685 - Prefer a clear comparison design for plant/observation projects:
686 same seed, cup, water, and paper-towel conditions, with only one
687 changed variable such as light exposure. If materials allow, use
688 2-3 labelled groups; if not, make the single-group observation
689 plan still presentation-ready.
690 - "Printable" means a clean markdown table, worksheet block, or
691 poster-board layout that the user can print from chat. Do not
692 create or refer to PDFs, HTML files, downloads, attachments,
693 local paths, generated artifacts, or workspace files unless the
694 user explicitly asked for a file/PDF/export/download.
695 - If the user asks for a beautiful or visually polished plan, make
696 the inline markdown itself polished: a memorable title, a concise
697 visual theme, color/palette suggestions, kid-facing labels,
698 a drawing-heavy record sheet, and a parent-ready poster layout.
699 - If the user asks to start with remembered constraints, include a
700 section titled exactly "## Remembered constraints I used" near the
701 top and list only facts found in PROVIDED_MEMORY_CONTEXT or the
702 current request. Do not invent memory.
703
704 Language and length:
705 - Match the user's language. For Chinese requests, write Simplified
706 Chinese throughout, including headings and child-facing text.
707 - For Chinese requests, do not use English section headings such as
708 "For You (the kid)" or "For the Grown-up".
709 - Do not include vocabulary cards unless the user explicitly asked
710 for vocab, word cards, bilingual support, 英语, 双语, or 单词.
711 - For straightforward home/school projects, target 1800-3200 Chinese characters
712 or an equivalent compact English length unless the user asks for a
713 long worksheet.
714
715 For Chinese safe projects, use this structure:
716
717 # 🛠️ <Project Title>
718
719 ## 先说假设
720 State the age/deadline/material/weather assumptions and which facts
721 are not live-verified.
722
723 ## 项目设计
724 Explain the child-friendly project question, final deliverable, and
725 2-3 learning goals in plain language.
726
727 ## 14 天计划
728 Give an actionable schedule. Group days into phases when that is
729 clearer than 14 long paragraphs, but preserve deadlines, daily
730 observation habits, parent touchpoints, and what the child does.
731
732 ## 材料和替代品
733 Summarize the materials table and substitutions. Keep shopping and
734 household alternatives practical.
735
736 ## 安全和翻车点
737 Include only the safety points that change behavior: stop-and-call
738 conditions, allergy/toxin/sharp/hot/water/electricity risks where
739 relevant, and 3 common failure modes with fixes.
740
741 ## 数据记录和画图
742 Include a simple observation template for date, height, leaf/color,
743 water, light, and one child-friendly chart idea.
744
745 ## 天气/光照调整
746 Use live weather only if verified; otherwise state "live weather not
747 verified / 实时天气未核验" and give safe indoor/low-light alternatives.
748
749 ## 最后展示怎么讲
750 Provide a 60-second child script and 3 likely teacher questions with
751 simple answers.
752
753 ## 家长每晚 20 分钟
754 Summarize what the adult checks each night and which steps require
755 hands-on help.
756
757 ## 还缺哪些实时信息
758 List only genuinely missing information that would improve the plan,
759 without asking the user to confirm before using the current answer.
760
761 For English safe projects, use equivalent English headings:
762 remembered constraints used when requested, known facts and
763 assumptions, project design, 14-day schedule,
764 materials/substitutes, safety/failure modes, printable record
765 sheet, poster-board layout, simple science explanation,
766 Weather / light adjustment, adult 20-minute check, and missing live
767 info. If the user asked for a visually polished plan, include a
768 short "visual theme" subsection.
769
770 End with a single line:
771 PACK_DELIVERED: {{ outputs.feasibility }}
772 - id: project_pack_audit
773 label: "项目包审稿"
774 label_en: "Project package review"
775 kind: llm_chat
776 depends_on:
777 - deliver_project_pack
778 - redirect_unsafe
779 - project_fact_ledger
780 - recall_past_projects
781 - outline_steps
782 - material_list
783 - safety_notes
784 - learning_objectives
785 - weather_check
786 - feasibility
787 - preferences
788 with:
789 system: "You are the final quality gate for a child project plan. Return only the cleaned final answer that the user should read. Do not explain the audit. Do not mention workflow, meta-skill, tool names, connector failures, workspace paths, or runtime details."
790 task: |
791 Rewrite the draft below into the final user-facing project pack.
792 Preserve useful content, but enforce the fact ledger strictly. If
793 the draft is only JSON, artifact metadata, download references,
794 process commentary, or otherwise not a complete user-facing answer,
795 rebuild the final project pack from the fact ledger and intermediate
796 source sections below.
797
798 Unsafe redirect source:
799 {{ outputs.get('redirect_unsafe', '') | truncate(1800) }}
800
801 Project fact ledger:
802 {{ outputs.get('project_fact_ledger', '') | truncate(2500) }}
803
804 Durable memory / past-project recall:
805 {{ outputs.get('recall_past_projects', '') | truncate(1600) }}
806
807 Step plan source:
808 {{ outputs.get('outline_steps', '') | truncate(2600) }}
809
810 Materials source:
811 {{ outputs.get('material_list', '') | truncate(1600) }}
812
813 Safety source:
814 {{ outputs.get('safety_notes', '') | truncate(1600) }}
815
816 Learning source:
817 {{ outputs.get('learning_objectives', '') | truncate(1600) }}
818
819 Weather/light source:
820 {{ outputs.get('weather_check', '') | truncate(900) }}
821
822 Draft project pack:
823 {{ outputs.get('deliver_project_pack', '') | truncate(8000) }}
824
825 Required audit rules:
826 - Return markdown only. Never return JSON, artifact metadata, file
827 paths, download links, or attachment notes.
828 - If feasibility is INAPPROPRIATE, PROJECT_SAFE is no, or the unsafe
829 redirect source is non-empty, return the unsafe redirect source as
830 the final answer. Preserve its refusal and all safe alternative
831 project ideas. Do not rebuild a normal project pack. End with
832 PACK_DELIVERED: no_safety_redirect.
833 - If the draft contains JSON keys such as "text", "artifacts",
834 "artifact_ref", "download_url", "mime", "sha256", "session_id",
835 "created_at", or "store", discard those metadata fields and write
836 a normal markdown answer instead.
837 - Remove leading process commentary such as "perfect match", "let me
838 run it", "I will run", "workflow", "meta-skill", or any similar
839 explanation of how the answer was produced. The first non-empty
840 line must be the user-facing project title, unless the user
841 explicitly requested a different first heading such as
842 "Remembered constraints I used".
843 - Preserve the user's language. If the request is English, write
844 English-only prose and English headings. If the request is Chinese,
845 write Simplified Chinese throughout.
846 - Remove exact calendar dates, weekdays, months, or current-year references
847 unless the user explicitly provided those exact dates. If the user
848 gave only a relative deadline, use Day 1...Day 14 and say exact
849 date not provided.
850 - Remove invented balcony direction, temperature ranges, rain forecasts,
851 sunshine hours, school rules, allergies, and local weather claims
852 unless they appear in the fact ledger as verified or user-provided.
853 - Remove fake sample measurements, fake dates, and predicted heights.
854 Observation tables must leave measurement cells blank or as
855 placeholders like "__ cm" / "[记录]".
856 - Remove tasting/eating suggestions. For observation projects, compare
857 height, color, firmness by safe touch if appropriate, drawings, and
858 notes.
859 - Keep every explicit user constraint from the fact ledger: child age,
860 relative deadline, location, available materials, budget, parent
861 time, light constraint, and requested sections.
862 - Keep every clear durable-memory constraint from the fact ledger:
863 remembered age, child preferences, writing tolerance, parent
864 availability, prior projects, and lessons learned. Do not rewrite
865 those fields as UNKNOWN when they appear in PROVIDED_MEMORY_CONTEXT.
866 - If the request asks not to repeat previous projects, explicitly
867 avoid or name the prior projects as non-options in one concise
868 sentence.
869 - If the user asks to use remembered facts, include a
870 "## Remembered constraints I used" section with the remembered
871 age, preferences, writing tolerance, parent time limit, prior
872 projects, and lessons learned when those facts appear in
873 PROVIDED_MEMORY_CONTEXT. Do not say no memory exists when
874 PROVIDED_MEMORY_CONTEXT contains facts.
875 - Prefer a clear comparison design when it fits: same seed, cup,
876 water, and paper-towel conditions, with only light exposure changed.
877 - Treat "printable record sheet" and "poster board layout" as inline
878 deliverables unless the user explicitly asked for PDF/file/export.
879 Include a clean markdown worksheet/table with blank boxes,
880 checkboxes, or placeholders; do not claim that a PDF, HTML file,
881 local file, download, or artifact was generated.
882 - For visually polished project packs, make the markdown itself
883 beautiful and school-ready: memorable title, visual theme or
884 palette, kid-facing labels, drawing-heavy worksheet, and a poster
885 layout the parent can recreate.
886 - Keep the answer compact and immediately usable: target 2500-3600 Chinese characters
887 for Chinese requests. Avoid long daily tables when grouped phases
888 are clearer.
889
890 Output structure for Chinese requests:
891 # 🛠️ <title>
892 ## 先说清楚哪些是已知、哪些未知
893 ## 项目设计
894 ## 14 天计划
895 ## 材料和替代品
896 ## 安全和翻车点
897 ## 数据记录和画图
898 ## 天气/光照调整
899 ## 最后展示怎么讲
900 ## 家长每晚 20 分钟
901 ## 还缺哪些实时信息
902
903 For English requests, use equivalent English headings only:
904 # <Project title>
905 ## Remembered constraints I used
906 ## Known facts and assumptions
907 ## Project design
908 ## 14-day plan
909 ## Materials and substitutes
910 ## Safety and failure modes
911 ## Printable record sheet
912 ## Poster-board layout
913 ## Simple science explanation
914 ## Weather / light adjustment
915 ## Adult 20-minute check
916 ## Missing live information
917
918 End with:
919 PACK_DELIVERED: {{ outputs.feasibility }}
920 - id: store_project
921 label: "存储项目"
922 label_en: "Store project"
923 kind: tool_call
924 tool: memory_save
925 tool_allowlist: [memory_save]
926 depends_on: [project_pack_audit, project_clarify, feasibility]
927 when: "outputs.feasibility != 'INAPPROPRIATE' and 'PROJECT_SAFE: yes' in outputs.preferences"
928 tool_args:
929 path: "memory/meta-kid-projects.md"
930 mode: append
931 content: |
932 ## Kid project run
933
934 Preferences:
935 {{ outputs.get('preferences', '') | truncate(1200) }}
936
937 Fact ledger:
938 {{ outputs.get('project_fact_ledger', '') | truncate(1800) }}
939
940 Final project pack excerpt:
941 {{ outputs.get('project_pack_audit', '') | truncate(2400) }}
942---
943
944# meta-kid-project-planner
945
946Junior & guardian persona meta-skill. Turns a child's project idea —
947"我要做火山", "I want to build a model rocket", "open a YouTube channel
948about insects" — into a kid-friendly step plan PLUS a parent-friendly
949oversight pack. The two audiences are concatenated in one markdown
950deliverable with clear `## 👦 For You (the kid)` / `## 👨👩👧 For the
951Grown-up` sections — a markdown-level workaround for the proposed
952`audience:` primitive (portfolio design §4.2).
953
954## Composition philosophy — multi-skill bundled orchestration
955
956This meta-skill uses **only OpenSquilla-bundled atomic skills** plus
957the five built-in step kinds — no external dependencies. The DAG calls
958into **5 distinct bundled atomic skills**:
959
960| Skill | Step(s) | Role in the DAG |
961|---|---|---|
962| `multi-search-engine` | `web_research` | Find existing how-to guides for the topic |
963| `deep-research` | `deep_research` | Extra round for `SAFETY_REVIEW_REQUIRED` or `NEEDS_SHOPPING` feasibility |
964| `memory` | `recall_past_projects`, `store_project` | Per-child memory: what they've already done; what they did this time. Avoids project repeats and builds a learning trajectory. |
965| `weather` | `weather_check` | When the topic is outdoor / garden / park, pull a 7-day forecast so `outline_steps` can recommend the best day |
966| `pptx` | `kid_deck` | When `PARENT_SUPERVISION: HANDS_ON`, produce a printable slide deck for the kid (visual step-by-step + safety callouts) |
967
968Step kinds used: `llm_chat`, `llm_classify`, `user_input`, `skill_exec`,
969`agent`.
970
971Vocab card generation is a plain `llm_chat` step (`vocab_cards`)
972grounded in `outputs.outline_steps + outputs.material_list` — the LLM
973produces 6 age-appropriate cards directly. No external flashcard
974skill is required.
975
976Bilingual rendering for `LANGUAGE: mixed` is also prompt-side in the
977relevant steps — no separate translation skill required.
978
979## Safety design
980
981Three layers of guardrail:
982
9831. `preferences` step rejects clearly inappropriate topics by setting
984 `PROJECT_SAFE: no` in its contract. This is prompt-side; cannot be
985 bypassed by clever phrasing because the model's response is
986 constrained to the return format.
9872. `feasibility` classifier produces `INAPPROPRIATE` for any topic
988 that involves weapons, dangerous chemistry, fire-without-adult,
989 self-harm-adjacent themes. `INAPPROPRIATE` short-circuits the
990 project pack and routes to `redirect_unsafe`.
9913. `redirect_unsafe` produces a gentle, non-shaming redirect with 3
992 alternative project ideas that scratch the same itch safely.
993
994The skill never silently degrades safety — if the topic is unsafe, the
995deliverable IS the redirect, with `PACK_DELIVERED: no_safety_redirect`.
996
997## Honest limitations (first-wave)
998
999- **`audience:` is markdown sections, not real two-principal output.**
1000 When the proposed primitive ships, the kid section can go to a
1001 child-facing surface while the parent section goes to the guardian's
1002 channel, separately.
1003- **No persistence of past projects.** Each invocation is independent
1004 — without `state:`, the skill cannot remember which projects the
1005 child has already done.
1006- **Vocab cards do not feed an FSRS deck.** The `vocab_cards` step
1007 emits a one-shot card list; integrating with a spaced-repetition
1008 state machine is reserved for a future `meta-spaced-rep-coach`.
1009- **Topic safety relies on prompt-side guardrails.** A future
1010 dedicated safety-policy step kind would be more robust than
1011 prompt-side judgment under adversarial inputs.