Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion src/assessment_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,39 @@ def _generation_note(mode: str, reason: str | None = None) -> str:
return f"Generation note: deterministic fallback. {suffix}"


def _soften_fallback_certainty(result: AssessmentResult) -> AssessmentResult:
"""Keep deterministic starter output from overstating unvalidated inputs."""
define_items = [
replace(
item,
statement=item.statement.replace(
"Problem confirmed:", "Reported problem statement:"
),
)
for item in result.dmaic_structure.get("define", [])
]
dmaic_structure = {**result.dmaic_structure, "define": define_items}
return replace(
result,
cleaned_problem_statement=result.cleaned_problem_statement.replace(
"has a measurable performance gap:",
"has a reported performance concern:",
),
role_summary=result.role_summary.replace(
"has a confirmed performance gap", "has a reported performance concern"
),
dmaic_structure=dmaic_structure,
)


def _fallback(
project: ProjectInput,
mode: str,
audience: str,
reason: str,
) -> AssessmentResult:
"""Return a deterministic result that records why it was used."""
result = _deterministic_fallback(project, mode, audience)
result = _soften_fallback_certainty(_deterministic_fallback(project, mode, audience))
return replace(
result,
role_summary=f"{_generation_note('deterministic_fallback', reason)}\n\n{result.role_summary}",
Expand Down
14 changes: 14 additions & 0 deletions tests/test_assessment_provenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ def test_missing_api_key_is_disclosed_as_deterministic_fallback(monkeypatch) ->
assert result.role_summary.startswith("Generation note: deterministic fallback.")


def test_fallback_does_not_present_unvalidated_input_as_confirmed(monkeypatch) -> None:
monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)

result = run_assessment(project(), mode="dmaic", audience="executive")

assert "confirmed performance gap" not in result.role_summary
assert "reported performance concern" in result.role_summary
assert "measurable performance gap" not in result.cleaned_problem_statement
assert "reported performance concern" in result.cleaned_problem_statement
assert result.dmaic_structure["define"][0].statement.startswith(
"Reported problem statement:"
)


def test_require_llm_fails_instead_of_silently_falling_back(monkeypatch) -> None:
monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)

Expand Down
Loading