Skip to content

Commit 06c2e45

Browse files
authored
Merge pull request #188 from speakeasy-api/fix/kit-diagnostics-noninterference
fix(factory): isolate runtime projection failures
2 parents 01eae09 + 1743efb commit 06c2e45

2 files changed

Lines changed: 41 additions & 3 deletions

File tree

factory/scripts/container-entrypoint.sh

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ else
5252
fi
5353
rm -f -- "$RUNTIME_FIFO"
5454

55+
diagnostics_available=true
5556
if ((projector_status != 0)); then
57+
diagnostics_available=false
5658
rm -f -- "$EXPORT_ROOT/factory-diagnostics.json"
57-
exit 1
59+
printf '%s\n' '[]' >"$PROJECTED_EVENTS"
5860
fi
5961

6062
jq --argjson success "$([[ $kit_status == 0 ]] && printf true || printf false)" '
@@ -107,8 +109,10 @@ elif [[ $(jq -r '.outcome' "$report") == failed ]]; then
107109
fi
108110

109111
if [[ -n $stage ]]; then
110-
"$DIAGNOSTICS_BUILDER" "$stage" "$kit_status" "$MANIFEST_EVENTS" \
111-
"$report" "$kit_errors_path" "$EXPORT_ROOT/factory-diagnostics.json" || true
112+
if [[ $diagnostics_available == true ]]; then
113+
"$DIAGNOSTICS_BUILDER" "$stage" "$kit_status" "$MANIFEST_EVENTS" \
114+
"$report" "$kit_errors_path" "$EXPORT_ROOT/factory-diagnostics.json" || true
115+
fi
112116
if [[ $stage == factory_outcome ]]; then
113117
cp "$report" "$EXPORT_ROOT/run-report.json"
114118
exit 0

factory/tests/test-container.sh

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,40 @@ MOCK
595595
fi
596596
done
597597

598+
workspace="$TMP/runtime-workspace-valid"; export_root="$TMP/runtime-export-valid"
599+
cat >"$fake_kit" <<'MOCK'
600+
#!/usr/bin/env bash
601+
set -euo pipefail
602+
marker=$(printf '\001kit-runtime\001')
603+
printf '%s%s\n' "$marker" '{"event":"future_event","summary":"SECRET_VALID_REPORT_CANARY"}' >&2
604+
printf '%s\n' 'ordinary diagnostic after rejected projection' >&2
605+
mkdir -p "$FACTORY_WORKSPACE_ROOT/.factory" "$FACTORY_WORKSPACE_ROOT/guides/acme"
606+
printf 'research\n' >"$FACTORY_WORKSPACE_ROOT/guides/acme/research.md"
607+
printf 'metadata\n' >"$FACTORY_WORKSPACE_ROOT/guides/acme/meta.yaml"
608+
cat >"$FACTORY_WORKSPACE_ROOT/.factory/run-report.json" <<'JSON'
609+
{"schema_version":1,"outcome":"awaiting_scope","provider":"Acme","slug":"acme","persona":"it-admin","summary":"Needs scope","open_questions":["Which auth path?"],"blockers":[],"nits":[],"review_rounds":0,"artifacts":["research.md","meta.yaml"]}
610+
JSON
611+
MOCK
612+
chmod +x "$fake_kit"
613+
if ! FACTORY_REPO_ROOT="$repo" FACTORY_INPUT_ROOT="$input" \
614+
FACTORY_WORKSPACE_ROOT="$workspace" FACTORY_EXPORT_ROOT="$export_root" \
615+
FACTORY_KIT_HOME="$TMP/runtime-home-valid" KIT_BIN="$fake_kit" \
616+
FACTORY_REPORT_VALIDATOR="$ROOT/factory/scripts/validate-report.sh" \
617+
FACTORY_EVENT_PROJECTOR="$ROOT/factory/scripts/project-kit-events.sh" \
618+
FACTORY_DIAGNOSTICS_BUILDER="$ROOT/factory/scripts/build-diagnostics.sh" \
619+
KIT_MODEL=openai/gpt-5.6-sol KIT_REASONING_EFFORT=high \
620+
"$ROOT/factory/scripts/container-entrypoint.sh" >"$TMP/runtime-valid.out" 2>"$TMP/runtime-valid.err"; then
621+
fail 'entrypoint let rejected diagnostics replace a valid Kit report'
622+
fi
623+
test -f "$export_root/run-report.json" || fail 'entrypoint lost valid report after rejected diagnostics'
624+
test -f "$export_root/guide/research.md" || fail 'entrypoint lost valid guide after rejected diagnostics'
625+
test ! -e "$export_root/factory-diagnostics.json" || fail 'entrypoint retained rejected diagnostics for valid report'
626+
assert_contains 'ordinary diagnostic after rejected projection' "$(cat "$TMP/runtime-valid.err")"
627+
assert_contains 'factory: invalid Kit runtime event' "$(cat "$TMP/runtime-valid.err")"
628+
if grep -Rq 'SECRET_VALID_REPORT_CANARY' "$TMP/runtime-valid.err" "$export_root"; then
629+
fail 'entrypoint exposed rejected marked runtime input for valid report'
630+
fi
631+
598632
cat >"$fake_kit" <<'MOCK'
599633
#!/usr/bin/env bash
600634
[[ "${KIT_RUNTIME_EVENTS:-}" == 1 ]] || exit 91

0 commit comments

Comments
 (0)