#!/usr/bin/env bash set -euo pipefail # # smoke-test.sh — Behavior smoke checks for coord continue/run workflows. # # Usage: # smoke-test.sh SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/_lib.sh" PASS=0 FAIL=0 pass_case() { echo "PASS: $1" PASS=$((PASS + 1)) } fail_case() { echo "FAIL: $1" >&2 FAIL=$((FAIL + 1)) } tmp_project="$(mktemp -d)" trap 'rm -rf "$tmp_project"' EXIT mkdir -p "$tmp_project/.mosaic/orchestrator" "$tmp_project/docs/scratchpads" cat > "$tmp_project/.mosaic/orchestrator/mission.json" <<'JSON' { "mission_id": "smoke-mission-20260223", "name": "Smoke Mission", "status": "active", "project_path": "SMOKE_PROJECT", "quality_gates": "pnpm lint && pnpm test", "milestones": [ { "id": "M1", "name": "Milestone One", "status": "pending" } ], "sessions": [] } JSON cat > "$tmp_project/docs/MISSION-MANIFEST.md" <<'MD' # Mission Manifest MD cat > "$tmp_project/docs/scratchpads/smoke-mission-20260223.md" <<'MD' # Scratchpad MD cat > "$tmp_project/docs/TASKS.md" <<'MD' | id | status | milestone | description | pr | notes | |----|--------|-----------|-------------|----|-------| | T-001 | pending | M1 | Smoke task | | | MD codex_continue_output="$(MOSAIC_COORD_RUNTIME=codex bash "$SCRIPT_DIR/continue-prompt.sh" --project "$tmp_project")" capsule_file="$tmp_project/.mosaic/orchestrator/next-task.json" if [[ -f "$capsule_file" ]]; then pass_case "continue writes next-task capsule"; else fail_case "continue writes next-task capsule"; fi if jq -e '.runtime == "codex"' "$capsule_file" >/dev/null 2>&1; then pass_case "capsule runtime is codex"; else fail_case "capsule runtime is codex"; fi if jq -e '.next_task == "T-001"' "$capsule_file" >/dev/null 2>&1; then pass_case "capsule next_task is T-001"; else fail_case "capsule next_task is T-001"; fi if grep -Fq 'Target runtime:** codex' <<< "$codex_continue_output"; then pass_case "continue prompt contains target runtime codex"; else fail_case "continue prompt contains target runtime codex"; fi codex_run_prompt="$(MOSAIC_COORD_RUNTIME=codex bash "$SCRIPT_DIR/session-run.sh" --project "$tmp_project" --print)" if [[ "$(printf '%s\n' "$codex_run_prompt" | head -n1)" == "Now initiating Orchestrator mode..." ]]; then pass_case "codex run prompt first line is mode declaration"; else fail_case "codex run prompt first line is mode declaration"; fi if grep -Fq 'Do NOT ask clarifying questions before your first tool actions' <<< "$codex_run_prompt"; then pass_case "codex run prompt includes no-questions hard gate"; else fail_case "codex run prompt includes no-questions hard gate"; fi if grep -Fq '"next_task": "T-001"' <<< "$codex_run_prompt"; then pass_case "codex run prompt embeds capsule json"; else fail_case "codex run prompt embeds capsule json"; fi claude_run_prompt="$(MOSAIC_COORD_RUNTIME=claude bash "$SCRIPT_DIR/session-run.sh" --project "$tmp_project" --print)" if [[ "$(printf '%s\n' "$claude_run_prompt" | head -n1)" == "## Continuation Mission" ]]; then pass_case "claude run prompt remains continuation prompt format"; else fail_case "claude run prompt remains continuation prompt format"; fi echo "" echo "Smoke test summary: pass=$PASS fail=$FAIL" if (( FAIL > 0 )); then exit 1 fi