Skip to main content

Findings & learning

Findings​

A finding is a durable issue Codesteward believes is worth tracking:

  • Severity, confidence, path/line, category
  • Optional suggested fix and specialist reasoning
  • Fingerprint for lifecycle (auto-fix / reopen when code changes)
  • Export as SARIF for GHAS / other tools

Findings appear in the session blade, the Findings backlog, PR comments (gate), and reports.

Learning​

Humans teach the system without rewriting prompts every time:

ActionEffect
πŸ‘ on a findingPositive preference memory β€” reinforce similar high-signal issues
πŸ‘Ž on a findingNegative memory + fingerprint suppress on next runs
Mark false positive / won’t fixSuppress or de-prioritize next runs
Scoped memoriesOrg-wide, repo, or PR

Learning is injected into specialist context and post-judge noise filtering (including a lightweight embedding preference filter) so the product gets quieter as your team reacts.

Automatic / indirect eval (merge outcomes)​

When a PR merges, Codesteward enqueues a lightweight pr_outcome job (not a full agent re-review):

OutcomeMeaning
Accepted / fixedSuggestion likely applied or finding path changed at merge
Unaddressed at mergeStill open and path untouched β€” soft ignore signal
False positive / dismissedHuman rejected the finding
Agent-miss candidateSensitive path changed with no prior finding
Gate regretApprove with critical open, or block with only noise
Thread resolved / unresolvedGitHub review thread on our comment β†’ soft accept / reopen
Security advisoryExternal GHSA β†’ coverage / FN focus (not a finding πŸ‘Ž)

Snapshots land in pr_outcomes / finding_outcomes (Postgres or .steward-data/outcomes.json).

Self-improvement: outcome β†’ memory (scoped)​

History is not always written as org learning. A consolidator promotes only when patterns are common, and chooses scope:

EvidenceMemory scope
Same fingerprint/path often in one repo onlyrepo
Same signal across β‰₯2 reposorg
Important (critical/high severity, gate regret, very high confidence) even in one repoorg (elevated)

Thresholds default to ~3 outcomes / 90 days (important elevation uses a lower bar). Source is outcome_aggregate so you can audit/delete on Learnings.

Runs automatically after each merge outcome job, or manually:

POST /v1/analytics/outcomes/consolidate

KPIs (prefer these over a mixed β€œaddress rate”):

  • fixAcceptRate = fixed | auto-fixed | πŸ‘
  • noiseRate = false_positive | πŸ‘Ž | dismissed | wontfix
  • openRate = still active

APIs: GET /v1/analytics/address-rate, GET /v1/analytics/outcomes, POST .../consolidate, GET .../eval-export
Offline: node packages/evals/src/run-eval.mjs packages/evals/fixtures/sample-outcomes.json

Policy interaction​

Policy (STEWARD.md) sets severity floors, nit caps, and skip globs. Learning does not let PR authors weaken base-branch policy β€” it steers specialist attention and noise, not security floors.

UI: Findings Β· Learnings