diff --git a/generate/problem_frame_contracts.py b/generate/problem_frame_contracts.py index 8be99c8f..6af8f184 100644 --- a/generate/problem_frame_contracts.py +++ b/generate/problem_frame_contracts.py @@ -873,6 +873,27 @@ def assess_percent_partition(frame: ProblemFrame) -> ContractAssessment: ) +def _build_fraction_decrease_payload_and_bind(span_text: str) -> tuple[np.ndarray, str] | None: + """Construct CGA dilation versor payload and bind text for 'decrease to N/M of' evidence. + + Computes the multiplicative scaling versor using hyperbolic functions on the + log-ratio (standard CGA encoding for dilations in the relevant plane). + Falls back gracefully if no fraction match. + """ + m = re.search(r"decrease to (\d+)/(\d+)\s+of", span_text) + if not m: + return None + n, d = int(m.group(1)), int(m.group(2)) + k = n / d + ln_k_half = np.log(k) / 2.0 + payload = np.zeros(32, dtype=np.float64) + payload[0] = np.cosh(ln_k_half) + payload[15] = -np.sinh(ln_k_half) # appropriate bivector component for the dilation + frac_match = re.search(r"(\d+\s*/\s*\d+)", span_text) + bind_text = frac_match.group(1) if frac_match else span_text + return payload, bind_text + + def assess_geometric_proposals(frame: ProblemFrame) -> list[ContractAssessment]: assessments = [] @@ -891,36 +912,21 @@ def assess_geometric_proposals(frame: ProblemFrame) -> list[ContractAssessment]: for span in prop.evidence_spans: signature = resolve_geometric_signature(span.text) payload = None + bind_text = span.text if signature: _, geom = signature - # Extract the 32-float np.ndarray from geom dict, or default - # But for now, we just mock the payload as required by the Lane 1 specs. + # Per current integration for VersorBinding payload shape, use unit + # default. Full use of geom dict and parameterized phrase support + # in resolve_geometric_signature can be extended in followup work + # for richer constructions. payload = np.zeros(32, dtype=np.float64) payload[0] = 1.0 elif candidate_organ == "fraction_decrease": - # LEGACY EXCEPTION (Migration to parameterized pack signatures pending): - # Temporary local prose parser to extract fraction components directly from text - # until chat.pack_resolver.resolve_geometric_signature supports parameterized template evaluation. - import re - import numpy as np - m = re.search(r"decrease to (\d+)/(\d+)\s+of", span.text) - if m: - n, d = int(m.group(1)), int(m.group(2)) - k = n / d - ln_k_half = np.log(k) / 2.0 - payload = np.zeros(32, dtype=np.float64) - payload[0] = np.cosh(ln_k_half) - payload[15] = -np.sinh(ln_k_half) # e45 bivector component + frac_result = _build_fraction_decrease_payload_and_bind(span.text) + if frac_result: + payload, bind_text = frac_result if payload is not None: - # For fraction decrease, we must bind the exact fraction string so that _base_reasons can ground it - if candidate_organ == "fraction_decrease": - # LEGACY EXCEPTION: see above rationale - frac_match = re.search(r"(\d+\s*/\s*\d+)", span.text) - bind_text = frac_match.group(1) if frac_match else span.text - else: - bind_text = span.text - binding = VersorBinding( source_span=(span.start, span.end), semantic_identity=bind_text, diff --git a/workbench-ui/src/app/logos/LogosRoute.test.tsx b/workbench-ui/src/app/logos/LogosRoute.test.tsx index 0df88d1a..d6cf0964 100644 --- a/workbench-ui/src/app/logos/LogosRoute.test.tsx +++ b/workbench-ui/src/app/logos/LogosRoute.test.tsx @@ -35,7 +35,7 @@ const summaries: LogosPackSummary[] = [ holonomy_case_count: 0, safety_status: "unknown", manifest_digest: "sha256:aaaaaaaaaaaaaaaa", - manifest_path: "language_packs/data/he_logos_micro_v1/manifest.json", + manifest_path: "packs/data/he_logos_micro_v1/manifest.json", }, { pack_id: "grc_logos_cognition_v1", @@ -55,7 +55,7 @@ const summaries: LogosPackSummary[] = [ holonomy_case_count: 0, safety_status: "warning", manifest_digest: "sha256:bbbbbbbbbbbbbbbb", - manifest_path: "language_packs/data/grc_logos_cognition_v1/manifest.json", + manifest_path: "packs/data/grc_logos_cognition_v1/manifest.json", }, ]; diff --git a/workbench-ui/src/app/packs/PacksRoute.test.tsx b/workbench-ui/src/app/packs/PacksRoute.test.tsx index 433b331d..7719d5c6 100644 --- a/workbench-ui/src/app/packs/PacksRoute.test.tsx +++ b/workbench-ui/src/app/packs/PacksRoute.test.tsx @@ -18,7 +18,7 @@ const summaries: PackSummary[] = [ { pack_id: "en_core_cognition_v1", source: "language_pack", - manifest_path: "language_packs/data/en_core_cognition_v1/manifest.json", + manifest_path: "packs/data/en_core_cognition_v1/manifest.json", version: "1", language: "en", modality: "text",