fix(scaffolding): contract scope resolver recognizes H-meta entity kinds

Contract BUILDER-2026-10-04T07:14:03Z-cli, closed: module:construction_decision
correctly_predicted, zero genuinely_unexpected_new.

T4.7 row-1 closure flagged rust-crate:query_memory resolving as
kind=unresolved — classify_surface's prefix set predated the H-meta
entity classes (rust-crate:/go-surface:/config:/workflow:), so
spine-modeled surfaces could never close correctly_predicted.

Red-first: test_hmeta_kind_prefixes_classify_as_structural_entity
failed pre-fix; identity-resolution path needed no change (works for
any id present in an authority). Regression frozen in
test_construction_decision.py (2 new tests, 21/21 file green,
decision neighborhood 107/107).
This commit is contained in:
Nick committed 2026-10-04 08:16:38 +01:00
1 parent 567fd39937
commit 57eaa8f383
3 files changed
+10172

No files matched your search

+12
View File
@@ -125,6 +125,14 @@ _SURFACE_UI = "ui:"
_SURFACE_REGION = "region:"
_SURFACE_CONTRACT = "contract:"
_SURFACE_MODULE = "module:"
# H-meta entity classes (spine meta-scaffold, 567fd39): the spine models
# these kinds as first-class entities, so contract scope resolution must
# recognize them as structural ids too — an unrecognized kind can never
# close as correctly_predicted (T4.7 row-1 flag).
_SURFACE_RUST_CRATE = "rust-crate:"
_SURFACE_GO_SURFACE = "go-surface:"
_SURFACE_CONFIG = "config:"
_SURFACE_WORKFLOW = "workflow:"
def classify_surface(surface: str) -> str:
@@ -141,6 +149,10 @@ def classify_surface(surface: str) -> str:
_SURFACE_CONTRACT,
_SURFACE_MODULE,
_SURFACE_CAPABILITY,
_SURFACE_RUST_CRATE,
_SURFACE_GO_SURFACE,
_SURFACE_CONFIG,
_SURFACE_WORKFLOW,
)
):
return "structural_entity"
File diff suppressed because it is too large. Load diff
+35
View File
@@ -373,3 +373,38 @@ def test_merge_build_new_never_upgrades_from_insufficient():
insuff = {"resolution": "INSUFFICIENT_EVIDENCE", "rationale": "weak"}
merged = cd.merge_resolutions([build, insuff])
assert merged["resolution"] == "INSUFFICIENT_EVIDENCE"
# ── H-meta resolver vocabulary (BUILDER-2026-10-04T07:14:03Z-cli) ──────────
# Regression: T4.7 row-1 closure flagged rust-crate: ids resolving as
# kind=unresolved — the classifier's prefix set predated the H-meta entity
# classes, so spine-modeled surfaces could never be correctly_predicted.
HMETA_KIND_IDS = [
"rust-crate:query_memory",
"rust-crate:evidence_provenance",
"go-surface:rune-entry",
"config:go-version.txt",
"workflow:ci.yml",
]
def test_hmeta_kind_prefixes_classify_as_structural_entity():
for eid in HMETA_KIND_IDS:
assert cd.classify_surface(eid) == "structural_entity", (
f"{eid}: H-meta entity kinds must classify as structural_entity, "
f"got {cd.classify_surface(eid)!r}"
)
def test_hmeta_kind_ids_resolve_by_identity_against_authority():
doc = ss.new_doc()
for eid in HMETA_KIND_IDS:
kind = eid.split(":", 1)[0]
ss.add_entity(doc, id=eid, kind=kind, identities={},
evidence_refs=["fixture"])
for eid in HMETA_KIND_IDS:
out = cd.resolve_surface(eid, "structural_entity", {"spine": doc})
assert out["resolved"], f"{eid}: {out['unresolved_reason']}"
assert out["resolved"][0]["entity_id"] == eid
assert out["resolved"][0]["via"] == "identity"