# Preserve rejected Focus candidate evidence

<!-- auto-oncall-optimization-record
{
  "schemaVersion": "auto-oncall-optimization-record-v1",
  "optimizationId": "focus-candidate-rejection-evidence-2026-07-21",
  "problems": [
    {
      "problemId": "focus-selector-repeats-rejected-group",
      "summary": "A Focus candidate rejected by fresh baseline is not durable input to the next selector run, so the same unchanged target and control group can be proposed again.",
      "status": "optimized_verified",
      "issueKeys": [],
      "sourceRefs": [],
      "signalTextIncludesAny": [],
      "observedThrough": "2026-07-21",
      "effectiveAt": "2026-07-21T09:19:02.000Z",
      "verifiedAt": "2026-07-21T09:21:00.000Z",
      "attemptedAction": "Persist bounded rejection evidence in the auto-oncall database and deterministically block the same target problem refs and control issue keys during the active lookback window.",
      "evidenceUrl": "https://github.com/tidbcloud/aisupport/pull/427"
    }
  ]
}
-->

## Bounded problem

`focus_candidate_rejected` proves that the selector produced a candidate but
the fresh creation baseline did not prove the target problem. No Focus Issue is
created, so the rejection reason was previously absent from the next selector
run. The source problem signals correctly remained eligible, but an unchanged
target/control group could be proposed and rejected again.

## Implementation and effective status

- Implementation: complete. Store a bounded candidate-group digest, target
  problem refs, control issue keys, blocking criteria, and baseline target
  outcomes in the existing auto-oncall database.
- Effective/deployment: deployed to staging in image
  `fc1e29055c345bcc851f64537e414a1c90ac8720`, which contains the implementation
  merged by `tidbcloud/aisupport#427`.

## Candidate problem signals

- A rejected candidate has no GitHub Focus checkpoint because Focus creation
  happens only after the baseline gate passes.
- A later daily run reads the same report evidence without the earlier
  target/control rejection context.

## Validation evidence

- Status: `optimized_verified`.
- 2026-07-21: typecheck passed.
- 2026-07-21: rejection persistence, selector deduplication, optimizer evidence,
  notification, and store-focused tests passed.
- 2026-07-21: full repository suite passed on the current `main` baseline,
  361/361.
- 2026-07-21 09:19 UTC: the live Deployment and Recent Optimizer CronJob both
  rendered image `fc1e29055c345bcc851f64537e414a1c90ac8720`; the new
  `auto_oncall_focus_candidate_rejections` table was accessible from the live
  service pod.
- 2026-07-21 09:21 UTC: an equivalent evaluation inside the live pod confirmed
  that the parser rejects the same candidate-group digest while a changed
  target/control grouping remains eligible.

## Unresolved gaps and next action

- Observe the next natural creation-baseline rejection and confirm its bounded
  evidence is reused on the following daily selector run.
