mirror of
https://github.com/norandom/OpenUltraSAST.git
synced 2026-10-16 03:49:26 +00:00
Decision-engine task 6.7 (partial). After the advisory-fix harvest (memory 724 -> 904 static examples), one compile per evaluable family and an outer grouped 5-fold evaluation of that family's own candidates, input profile v1, priors off, k = 5, cross-fitted Platt, nested operating points (repository-cluster bootstrap 95%): family n AUC(s) ADVISORY R / P 'vulnerable' P / R ECE canary injection 110 0.77 [0.67, 0.88] 0.88 / 0.57 0.84 / 0.36 0.093 0.77 untrusted_dest. 62 0.85 [0.76, 0.94] 0.84 / 0.73 0.96 / 0.66 0.071 0.87 path 35 0.89 [0.79, 0.97] 0.86 / 0.69 0.89 / 0.76 0.119 0.90 output_encoding 44 0.91 [0.82, 0.97] 0.86 / 0.81 0.94 / 0.55 0.045 0.90 deserialization 46 0.90 [0.82, 0.97] 0.83 / 0.76 0.93 / 0.83 0.095 0.93 access_control 37 0.96 [0.90, 1.00] 0.91 / 0.91 1.00 / 0.61 0.076 0.83 BLOCK offered for none: calibration fails everywhere except output_encoding, where no fold reaches a Wilson lower bound of 0.95. Within paired groups (a function and its own fix) AUC is lower, 0.72-0.93: every single-label group in the new families holds positives only. Injection learning-curve point, paired (same program, candidates, folds): memory 724 -> 904, AUC 0.76 -> 0.77 (no injection example was added). $2.88 metered DeepSeek (ceiling $8; balance 17.73 -> 16.73), $0.0009 embeddings. Instrument fix: compiled demonstrations now follow the near-duplicate rule (cos >= 0.98) that retrieval and the pre-call assertion apply; the assertion had stopped the untrusted_destination evaluation. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
295 lines
14 KiB
Python
295 lines
14 KiB
Python
"""Retrieval from the local memory, and the evaluation boundary (learned-decision-engine design 4.2, Req 3.2, 3.4).
|
|
|
|
No model. Stage 1 ranks the eligible examples by a **Gower distance** over the allow-listed features of the active
|
|
profile, computed per instrument block so that missing is explicit, never imputed:
|
|
|
|
- both blocks ``ran``: the mean over the block's features of ``|a - b| / cap`` (ints), ``|a - b|`` (fractions;
|
|
the one unbounded mean, ``verify.turns_mean``, over a cap of 10), ``0``/``1`` for bools and enums; ``null`` in
|
|
both is ``0``, in one is ``1``;
|
|
- different states (``ran`` vs ``none``/``failed``/``not_applicable``, or ``failed`` vs ``none``): ``1``; the
|
|
same non-``ran`` state: ``0``;
|
|
- ``D`` is the uniform mean over the profile's blocks; prior features are dropped with ``priors = "off"``, and the blocks
|
|
of instruments the input profile withholds (``inputs``, default ``v1``: the engine) are left out entirely.
|
|
|
|
Ties break by ``sha256(example id + seed)``; the first ``n1 = 40`` of the candidate's family and the first ``n1``
|
|
of the other families go to stage 2, a cosine re-rank of the code
|
|
embeddings, ``r = lam (1 - D) + (1 - lam) cos``. Without the target's vector the whole retrieval is
|
|
``signals_only``; an example without a vector scores ``cos = 1 - D`` (its signal similarity, so it keeps its
|
|
stage-1 standing). The **balance rule** then takes ``k_ret = 6``: at most ``k/2`` per label, at most 2 per
|
|
repository group, at most 2 contrast examples from other families whenever the pool holds the candidate's family
|
|
(never padded with more); ``short`` when the pool cannot fill it.
|
|
|
|
**The boundary.** :func:`eligible` is the only way an example enters a prompt -- retrieved examples and compiled
|
|
demonstrations alike: not the target's group, not a group the fold evaluates, not the held-out source, not the
|
|
held-out framework, and (outside deployment) not a near-duplicate of the target (cosine >= 0.98). The program
|
|
repeats the check on the ids it actually rendered (:func:`assert_boundary`).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
from collections.abc import Iterable, Mapping, Sequence
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from .embeddings import cosine
|
|
from .examples import Example
|
|
from .folds import Fold
|
|
from .labels import repo_name
|
|
from .schema import DEFAULT_INPUTS, UNBOUNDED_FLOATS, FeatureSpec, features_for, instruments_for, withheld
|
|
|
|
N1 = 40
|
|
K_RET = 6
|
|
LAM = 0.5
|
|
NEAR_DUPLICATE_COS = 0.98
|
|
UNBOUNDED_CAP = 10.0
|
|
PER_GROUP = 2
|
|
CONTRAST = 2 # contrast examples from other families, at most, while the pool holds the target's family
|
|
|
|
|
|
class BoundaryViolation(AssertionError):
|
|
"""An example or demonstration outside the evaluation boundary reached a prompt."""
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Target:
|
|
"""What retrieval knows of a candidate: its group (for the boundary), family, record and excerpt vector."""
|
|
|
|
group: str
|
|
family: str
|
|
profile: str
|
|
x: Mapping[str, Any]
|
|
instruments: Mapping[str, Mapping[str, Any]]
|
|
vector: Sequence[float] | None = None
|
|
|
|
@classmethod
|
|
def of(cls, example: Example, vector: Sequence[float] | None = None) -> Target:
|
|
return cls(example.group, example.family, example.profile, example.x, example.instruments, vector)
|
|
|
|
|
|
def _blocks(profile: str, priors: str) -> list[tuple[str, list[FeatureSpec]]]:
|
|
specs = [s for s in features_for(profile) if not (s.prior and priors == "off")]
|
|
blocks = [(name, [s for s in specs if s.instrument == name]) for name in instruments_for(profile)]
|
|
return [(name, block) for name, block in blocks if block]
|
|
|
|
|
|
def _feature_distance(spec: FeatureSpec, a: Any, b: Any) -> float:
|
|
if a is None and b is None:
|
|
return 0.0
|
|
if a is None or b is None:
|
|
return 1.0
|
|
if spec.type == "int":
|
|
return min(1.0, abs(int(a) - int(b)) / float(spec.cap or 1))
|
|
if spec.type == "float":
|
|
cap = UNBOUNDED_CAP if spec.name in UNBOUNDED_FLOATS else 1.0
|
|
return min(1.0, abs(float(a) - float(b)) / cap)
|
|
return 0.0 if a == b else 1.0
|
|
|
|
|
|
def gower(
|
|
a_x: Mapping[str, Any],
|
|
a_instruments: Mapping[str, Mapping[str, Any]],
|
|
b_x: Mapping[str, Any],
|
|
b_instruments: Mapping[str, Mapping[str, Any]],
|
|
profile: str,
|
|
*,
|
|
priors: str = "off",
|
|
inputs: str = DEFAULT_INPUTS,
|
|
) -> float:
|
|
"""The per-instrument Gower distance of two records of ``profile`` (module docstring), in [0, 1]. The blocks of
|
|
instruments the input profile withholds (v1: the engine) are not compared, so neighbours cannot carry them."""
|
|
hidden = withheld(inputs)
|
|
# a withheld feature leaves its instrument's block in place: the state still counts, as it is still rendered
|
|
total = 0.0
|
|
blocks = [(name, [s for s in specs if s.name not in hidden]) for name, specs in _blocks(profile, priors) if name not in hidden]
|
|
for name, specs in blocks:
|
|
sa, sb = a_instruments.get(name, {}).get("state", "none"), b_instruments.get(name, {}).get("state", "none")
|
|
if sa != sb:
|
|
total += 1.0
|
|
elif sa == "ran":
|
|
total += sum(_feature_distance(s, a_x.get(s.name), b_x.get(s.name)) for s in specs) / len(specs) if specs else 0.0
|
|
return total / len(blocks) if blocks else 0.0
|
|
|
|
|
|
def ineligible(example: Example, target: Target, fold: Fold, *, cos: float | None = None) -> str | None:
|
|
"""Why ``example`` may not enter ``target``'s prompt under ``fold``, or ``None`` when it may."""
|
|
if example.group and example.group == target.group:
|
|
return "target group"
|
|
if example.group in fold.eval_groups:
|
|
return "evaluated group"
|
|
if fold.held_source is not None and example.source == fold.held_source:
|
|
return "held-out source"
|
|
if fold.held_framework is not None and fold.held_framework in example.frameworks:
|
|
return "held-out framework"
|
|
if fold.phase != "deployment" and cos is not None and cos >= NEAR_DUPLICATE_COS:
|
|
return "near duplicate"
|
|
return None
|
|
|
|
|
|
def eligible(example: Example, target: Target, fold: Fold, *, cos: float | None = None) -> bool:
|
|
return ineligible(example, target, fold, cos=cos) is None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Retrieval:
|
|
examples: tuple[Example, ...]
|
|
mode: str # signals+embeddings | signals_only
|
|
balance: str # ok | short
|
|
near_duplicates: int
|
|
pool: int # eligible examples before stage 1
|
|
without_vector: int
|
|
|
|
@property
|
|
def neighbours(self) -> dict[str, dict[str, int]]:
|
|
"""Counts by label and family (never identities), for the decision row."""
|
|
labels: dict[str, int] = {}
|
|
families: dict[str, int] = {}
|
|
for example in self.examples:
|
|
labels[str(example.label)] = labels.get(str(example.label), 0) + 1
|
|
families[example.family] = families.get(example.family, 0) + 1
|
|
return {"label": dict(sorted(labels.items())), "family": dict(sorted(families.items()))}
|
|
|
|
|
|
def _tie(example_id: str, seed: int) -> str:
|
|
return hashlib.sha256(f"{example_id}{seed}".encode()).hexdigest()
|
|
|
|
|
|
def balance(ranked: Sequence[Example], family: str, k: int = K_RET) -> tuple[list[Example], str]:
|
|
"""Take up to ``k`` in rank order: <= k/2 per label, <= 2 per group, and at most 2 contrast examples from other
|
|
families whenever the pool holds any example of the target's family (maintainer, 2026-10-01: "allow 2 contrast").
|
|
A pool without the target's family takes from the others under the label and group caps. ``short`` when the
|
|
pool cannot fill ``k`` or a label minimum: what exists is taken, never padded with more contrast."""
|
|
per_label = k // 2
|
|
other_cap = min(CONTRAST, k) if any(e.family == family for e in ranked) else k
|
|
taken: list[Example] = []
|
|
labels: dict[int, int] = {}
|
|
groups: dict[str, int] = {}
|
|
others = 0
|
|
for example in ranked:
|
|
if len(taken) == k:
|
|
break
|
|
if example.family != family and others >= other_cap:
|
|
continue
|
|
if labels.get(example.label, 0) < per_label and groups.get(example.group, 0) < PER_GROUP:
|
|
others += example.family != family
|
|
taken.append(example)
|
|
labels[example.label] = labels.get(example.label, 0) + 1
|
|
groups[example.group] = groups.get(example.group, 0) + 1
|
|
pool_labels = {e.label for e in ranked}
|
|
short = len(taken) < k or any(labels.get(lab, 0) < min(2, per_label) for lab in (0, 1) if lab in pool_labels)
|
|
return taken, "short" if short else "ok"
|
|
|
|
|
|
def retrieve(
|
|
target: Target,
|
|
pool: Iterable[Example],
|
|
fold: Fold,
|
|
*,
|
|
vectors: Mapping[str, Sequence[float]] | None = None,
|
|
n1: int = N1,
|
|
k: int = K_RET,
|
|
lam: float = LAM,
|
|
seed: int = 0,
|
|
priors: str = "off",
|
|
inputs: str = DEFAULT_INPUTS,
|
|
) -> Retrieval:
|
|
"""The ``k`` balanced examples for ``target`` from the eligible part of ``pool`` (module docstring)."""
|
|
candidates = [e for e in pool if e.profile == target.profile and eligible(e, target, fold)]
|
|
ranked_all = sorted(
|
|
((gower(target.x, target.instruments, e.x, e.instruments, target.profile, priors=priors, inputs=inputs), e) for e in candidates),
|
|
key=lambda pair: (pair[0], _tie(pair[1].id, seed)),
|
|
)
|
|
# stage 1 per side: the n1 nearest of the target's family and the n1 nearest contrast examples, so a family that is a
|
|
# minority of the memory still reaches stage 2 (the balance rule then takes at most 2 contrast examples)
|
|
own = [pair for pair in ranked_all if pair[1].family == target.family][:n1]
|
|
scored = own + [pair for pair in ranked_all if pair[1].family != target.family][:n1]
|
|
mode = "signals+embeddings" if target.vector is not None and vectors else "signals_only"
|
|
near = without = 0
|
|
reranked: list[tuple[float, str, Example]] = []
|
|
for distance, example in scored:
|
|
similarity = 1.0 - distance
|
|
vector = (vectors or {}).get(example.excerpt_sha) if mode != "signals_only" else None
|
|
if mode != "signals_only" and target.vector is not None and vector is not None:
|
|
cos = cosine(target.vector, vector)
|
|
if not eligible(example, target, fold, cos=cos):
|
|
near += 1
|
|
continue
|
|
score = lam * similarity + (1 - lam) * cos
|
|
else:
|
|
without += mode != "signals_only"
|
|
score = similarity
|
|
reranked.append((-score, _tie(example.id, seed), example))
|
|
ranked = [example for _, _, example in sorted(reranked, key=lambda t: (t[0], t[1]))]
|
|
chosen, state = balance(ranked, target.family, k)
|
|
return Retrieval(tuple(chosen), mode, state, near, len(candidates), without)
|
|
|
|
|
|
def assert_boundary(
|
|
ids: Iterable[str], examples: Mapping[str, Example], target: Target, fold: Fold, *, vectors: Mapping[str, Sequence[float]] | None = None
|
|
) -> None:
|
|
"""Raise :class:`BoundaryViolation` when any rendered id is unknown or ineligible for ``target`` under ``fold``."""
|
|
for example_id in ids:
|
|
example = examples.get(example_id)
|
|
if example is None:
|
|
raise BoundaryViolation(f"rendered example {example_id[:12]} is not in the memory snapshot")
|
|
vector = (vectors or {}).get(example.excerpt_sha)
|
|
cos = cosine(target.vector, vector) if target.vector is not None and vector is not None else None
|
|
why = ineligible(example, target, fold, cos=cos)
|
|
if why is not None:
|
|
raise BoundaryViolation(f"rendered example {example_id[:12]} is outside the boundary of {fold.name}: {why}")
|
|
|
|
|
|
def demonstrations_for(
|
|
demos: Sequence[Mapping[str, Any]],
|
|
examples: Mapping[str, Example],
|
|
target: Target,
|
|
fold: Fold,
|
|
*,
|
|
vectors: Mapping[str, Sequence[float]] | None = None,
|
|
) -> list[Mapping[str, Any]]:
|
|
"""The compiled demonstrations usable for ``target``: an ineligible one is swapped for its alternate when that
|
|
is eligible, and dropped otherwise (leave-one-framework-out on a demonstration's framework; in evaluation, a
|
|
demonstration whose excerpt is a near-duplicate of the target's, the same rule as retrieval and
|
|
:func:`assert_boundary`)."""
|
|
|
|
def ok(example: Example | None) -> bool:
|
|
if example is None:
|
|
return False
|
|
vector = (vectors or {}).get(example.excerpt_sha)
|
|
cos = cosine(target.vector, vector) if target.vector is not None and vector is not None else None
|
|
return eligible(example, target, fold, cos=cos)
|
|
|
|
out: list[Mapping[str, Any]] = []
|
|
for demo in demos:
|
|
if ok(examples.get(str(demo["example_id"]))):
|
|
out.append(demo)
|
|
continue
|
|
alternate = demo.get("alternate")
|
|
if isinstance(alternate, Mapping) and ok(examples.get(str(alternate.get("example_id")))):
|
|
out.append(alternate)
|
|
return out
|
|
|
|
|
|
def deployment_fold(repository: str, groups: Iterable[str]) -> tuple[Fold, str | None]:
|
|
"""The boundary of a deployed scan: a repository that is a corpus group excludes its own cases."""
|
|
name = repo_name(repository) if repository else ""
|
|
if name and name in set(groups):
|
|
return Fold(
|
|
"deployment", "deployment", frozenset({name}), phase="deployment"
|
|
), "repository is in the corpus: its own cases excluded"
|
|
return Fold("deployment", "deployment", frozenset(), phase="deployment"), None
|
|
|
|
|
|
def seed_memory(examples: Iterable[Example], case_group: str, fold: Fold | None = None) -> list[Example]:
|
|
"""The examples a plane Run case may be seeded with: none of its own group (nor of the fold's evaluated groups,
|
|
held source or framework). The host filters; the sandbox never sees the rest."""
|
|
target = Target(case_group, "", "", {}, {})
|
|
boundary = fold or Fold("deployment", "seed", frozenset(), phase="deployment")
|
|
return [e for e in examples if e.group != case_group and eligible(e, target, boundary)]
|
|
|
|
|
|
__all__ = [
|
|
"K_RET", "LAM", "N1", "NEAR_DUPLICATE_COS", "BoundaryViolation", "Retrieval", "Target", "assert_boundary", "balance",
|
|
"demonstrations_for", "deployment_fold", "eligible", "gower", "ineligible", "retrieve", "seed_memory",
|
|
] # fmt: skip
|