docs(s31): close the review's honesty gap — narrow semantic claims to the shipped mechanism
This commit is contained in:
parent
5481781ca5
commit
9e149c6847
5 changed files with 81 additions and 36 deletions
|
|
@ -283,11 +283,14 @@ async def run_project(
|
|||
(S4.2, comparison protocol §4 pkt 2/3) is the offline drill: it walks the whole path up to the
|
||||
EAGER client build, writes the run-config artefact (when ``outbox_dir`` is set), and returns a
|
||||
``DryRunReport`` BEFORE the first model call (``debate.run``) — zero chat calls.
|
||||
``semantic_retrieval`` (S3.1) is the opt-in scaling seam: when true, the store's ranker is
|
||||
swapped for a ``HybridRanker`` that blends brute-force cosine over embedded features with the
|
||||
structural score, so a semantically related prior verdict carrying a DIFFERENT cost-code set
|
||||
can reach the Step-1 fold. Default false keeps the structural, text-excluded ranking exactly
|
||||
as before."""
|
||||
``semantic_retrieval`` (S3.1) is the opt-in scaling SEAM — the deliverable is the extension
|
||||
point, not better retrieval. When true, a ``HybridRanker`` blends a cosine term over the
|
||||
embedded feature triple (sorted cost codes, measure type, magnitude bucket) with the structural
|
||||
score, which lets a prior verdict on a DIFFERENT cost-code set outrank one that ties
|
||||
structurally. The shipped ``FakeEmbedder`` is a deterministic sha256 projection carrying NO
|
||||
semantics, so over a structural tie the resulting order is deterministic but arbitrary;
|
||||
retrieval *quality* arrives only with an embedder injected via ``embedder=`` or
|
||||
``--embedder-config``. Default false keeps the structural ranking exactly as before."""
|
||||
# 0. Fail-fast: an outbox write is byte-deterministic and keyed on run_id — no wall-clock default.
|
||||
if outbox_dir is not None and run_id is None:
|
||||
raise ValueError(
|
||||
|
|
@ -390,8 +393,14 @@ async def run_project(
|
|||
# hypothesis context BEFORE generation, keyed on the OKF bundle's candidate features (available
|
||||
# pre-hypothesis). THIS is the one missing dataflow — previously ExpeL was computed
|
||||
# post-generation into a discarded SessionContext (step 7 below), so a prior verdict could not
|
||||
# reach the next hypothesis. Bundle-driven path with a populated store only; the road path is
|
||||
# untouched (its post-hoc, proposal-keyed retrieval below is unchanged).
|
||||
# reach the next hypothesis. Bundle-driven path with a populated store only.
|
||||
#
|
||||
# Scope of the --semantic-retrieval opt-in, stated precisely (an earlier version of this
|
||||
# comment claimed "the road path is untouched", which the flag made false): the ranker built
|
||||
# below is passed to ALL THREE retrievals this run performs — this fold, and the post-hoc
|
||||
# ExpeLContextProvider + store.retrieve in step 7 — so the flag reaches the road path's
|
||||
# proposal-keyed retrieval too. What IS untouched on the road path is the fold itself: it stays
|
||||
# bundle-gated, so a --docs-dir-only run remains single-shot either way.
|
||||
# S3.1 opt-in: build the hybrid ranker as a LOCAL, then pass it explicitly at each retrieval
|
||||
# this run performs. It is deliberately not assigned to ``store.retriever``: the store is
|
||||
# caller-owned (``run_portfolio`` threads one store across every project, and a library caller
|
||||
|
|
@ -724,10 +733,13 @@ def main(argv: list[str] | None = None) -> int:
|
|||
parser.add_argument(
|
||||
"--semantic-retrieval",
|
||||
action="store_true",
|
||||
help="S3.1 opt-in scaling seam: rank prior verdicts with a hybrid of brute-force cosine "
|
||||
"over embedded features and the structural score, so a semantically related verdict with a "
|
||||
"DIFFERENT cost-code set can reach the hypothesis prompt. Valid in both modes; OFF by "
|
||||
"default, and off means the structural, text-excluded ranking is unchanged",
|
||||
help="S3.1 opt-in scaling SEAM: blend a cosine term over the embedded feature triple with "
|
||||
"the structural score, so a prior verdict on a DIFFERENT cost-code set can outrank one that "
|
||||
"ties structurally. The shipped embedder is a semantics-free sha256 projection — this buys "
|
||||
"the extension point, not better retrieval; inject a real one with --embedder-config. "
|
||||
"Accepted in both modes, but in single-project mode it REQUIRES --bundle-dir and "
|
||||
"--verdict-dir (without them it cannot take effect, and is refused rather than ignored). "
|
||||
"OFF by default, and off means the structural ranking is unchanged",
|
||||
)
|
||||
parser.add_argument("--decision", default="approved", choices=["approved", "rejected"])
|
||||
parser.add_argument("--rationale", default="reviewed by expert")
|
||||
|
|
|
|||
|
|
@ -92,8 +92,9 @@ _MAGNITUDE_BUCKETS = [(0.0, 1e5), (1e5, 5e5), (5e5, 1e6), (1e6, float("inf"))]
|
|||
class Embedder(Protocol):
|
||||
"""Maps structured proposal features to a fixed-length float64 vector.
|
||||
|
||||
The real implementation (an embeddings client) is a config-only extension point and is NOT
|
||||
built here — tests and the offline path use ``FakeEmbedder``."""
|
||||
The real implementation (an embeddings client) is a CODE-LEVEL extension point and is NOT
|
||||
built here — tests and the offline path use ``FakeEmbedder``. Config selects from the closed
|
||||
``build_embedder`` registry; it can never name a module to import (see ``EmbedderConfig``)."""
|
||||
|
||||
def __call__(self, features: ProposalFeatures) -> np.ndarray: ...
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue