Warn about broad tool response projections
Deploy / deploy (push) Successful in 1m40s
CI / Rust Checks (push) Failing after 5m3s
CI / UI Checks (push) Has been skipped
CI / Frontend E2E (push) Has been skipped
CI / Deployment Manifests (push) Has been skipped

This commit is contained in:
github-ops
2026-06-20 21:05:30 +00:00
parent 5970db5449
commit ce773e6196
10 changed files with 328 additions and 8 deletions
+56 -2
View File
@@ -1,6 +1,7 @@
use crank_core::{
ToolDescription, ToolQualityFinding, ToolQualityReport, ToolQualitySchemaNode,
ToolQualitySeverity, analyze_tool_identity_quality, analyze_tool_schema_quality,
ToolDescription, ToolQualityFinding, ToolQualityMappingRule, ToolQualityMappingSet,
ToolQualityReport, ToolQualitySchemaNode, ToolQualitySeverity, analyze_tool_identity_quality,
analyze_tool_response_projection_quality, analyze_tool_schema_quality,
};
#[test]
@@ -181,6 +182,59 @@ fn recommends_enum_for_mode_like_string_parameter() {
));
}
#[test]
fn warns_when_output_mapping_returns_full_response_body() {
let mapping = ToolQualityMappingSet {
rules: vec![ToolQualityMappingRule {
source: "$.response.body".to_owned(),
target: "$.output".to_owned(),
}],
};
let report = analyze_tool_response_projection_quality(&mapping);
assert!(has_finding(
&report,
"response_projection_full_body",
ToolQualitySeverity::Warning
));
}
#[test]
fn accepts_output_mapping_with_selected_fields() {
let mapping = ToolQualityMappingSet {
rules: vec![ToolQualityMappingRule {
source: "$.response.body.rates.EUR".to_owned(),
target: "$.output.rate".to_owned(),
}],
};
let report = analyze_tool_response_projection_quality(&mapping);
assert!(!report.blocking);
assert!(report.findings.is_empty());
}
#[test]
fn marks_large_output_projection_as_info() {
let mapping = ToolQualityMappingSet {
rules: (0..12)
.map(|index| ToolQualityMappingRule {
source: format!("$.response.body.field_{index}"),
target: format!("$.output.field_{index}"),
})
.collect(),
};
let report = analyze_tool_response_projection_quality(&mapping);
assert!(has_finding(
&report,
"response_projection_many_fields",
ToolQualitySeverity::Info
));
}
fn has_finding(report: &ToolQualityReport, code: &str, severity: ToolQualitySeverity) -> bool {
report
.findings