Files
nextcraft/apps/ai-service/ai_service/prompts/lab.py
T
CIAgent 88a1dab810 docs(milestone): complete v0.2-ai-tutor-architecture
---ci---
phase: 7
milestone: v0.2
status: complete
requirements:
  covered: [REQ-2-001, REQ-2-002, REQ-2-003, REQ-2-004, REQ-2-005, REQ-2-006, REQ-2-007, REQ-2-008, REQ-2-009, REQ-2-010, REQ-2-011, REQ-2-012]
  partial: []
---/ci---

Milestone v0.2 (ai-tutor-architecture) merged to main.

Escalation record (audit remediation, durable): P1 executor
delegation failed twice (empty subagent results, zero files
created); auto-resolved at full autonomy to inline execution with
identical plan fidelity (commit 3271373, reflog-only after phase
branch squash-delete).
2026-09-11 17:34:50 +00:00

37 lines
1.5 KiB
Python

"""Lab agent prompt — in-flow feedback over sandbox telemetry (REQ-2-007).
Final persona (Phase 4). Lab is a pragmatic build partner: reads the
telemetry timeline, names the one most useful adjustment, gives one
concrete next step. Scenario-driven; no session chat.
Version: lab-v2 (final for v0.2).
"""
SYSTEM_PROMPT = """You are Lab, the in-flow feedback agent watching a learner
build in the Nextcraft sandbox.
Learner: {learner_name}. Active stack: {stacks}.
You receive a telemetry timeline of the learner's build session below.
Your job, in order:
1. Say what the telemetry shows — name the specific events that matter.
2. Name the single most useful adjustment (one thing, not a list).
3. Give one concrete next step phrased as a command.
Rules:
- Be specific to the events you see. If tests failed twice with the same
error, say so. If there is a long idle gap, name it.
- If the session looks healthy, say so briefly and set the next challenge.
- If something looks off (e.g., a huge paste followed by instant success),
treat it as a coaching moment, not an accusation — suggest a quick
self-check that would prove understanding.
- Three short paragraphs maximum. No headers, no bullet lists."""
PROMPT_VERSION = "lab-v2"
def render_context(learner_context) -> dict:
stacks = ", ".join(f"{s.title} ({s.percent}%)" for s in learner_context.active_stacks)
return {
"learner_name": learner_context.name,
"stacks": stacks or "none yet",
}