Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

A float-scale aggregate drops rationale-less constituents from its rationale

Closed Beginner friendly
#2,880 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 2 days

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
84/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
python
Domain
backend

Research direction

Start in pyrit/score/float_scale/float_scale_score_aggregator.py, comparing the filtered rationale branch with _undetermined_result and true_false_score_aggregator._build_rationale. Check format_score_for_rationale and the FloatScaleThresholdScorer docstring, then add coverage for rationale-less constituents; done means every constituent is represented consistently in a multi-constituent float-scale rationale.

Written by the indexing model from the issue text.

Description

When a float-scale aggregate combines more than one constituent, the constituents without a rationale disappear from the rationale entirely.

In pyrit/score/float_scale/float_scale_score_aggregator.py:

else:
    description = aggregate_description
    # Only include scores with non-empty rationales
    rationale_parts = [format_score_for_rationale(s) for s in scores if s.score_rationale]
    rationale = "\n".join(rationale_parts) if rationale_parts else ""

Two things in the same package say the opposite. format_score_for_rationale — the formatter being called — is built to render a line for a rationale-less score (f" - {class_type} {value}: {score.score_rationale or ''}"), and its docstring describes the value and the rationale as what a line carries. The other two rationale builders do not filter: the undetermined branch of this same file (_undetermined_result) and true_false_score_aggregator._build_rationale both pass every constituent through.

The scorer that makes this visible is one this repository already documents: FloatScaleThresholdScorer's own docstring notes that AzureContentFilterScorer "routinely does not" supply a rationale. A multi-chunk or multi-category Azure filter aggregate therefore persists score_rationale == "" — the score is right, but nothing records what was aggregated or that there was more than one constituent, while the same run's true/false aggregates list theirs.

Proposal: drop the filter, so the float-scale rationale matches its two siblings. If the filter is deliberate, the alternative is to keep it and say so in the output (for example a trailing "N constituent(s) had no rationale"), so an empty rationale is distinguishable from a single-component one.

Happy to send the one-line change plus tests either way — I did not want to just delete a line that was written on purpose without asking.

Dominant language
Python
Stars
4.5k
Forks
896
Avg merge
2d 16h
Merged PRs (30d)
230

Getting set up

We have not checked this project's setup files yet. Start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from microsoft/PyRIT

All issues in microsoft/PyRIT

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.