diff --git a/src/grimoire/services/shape_ledger.py b/src/grimoire/services/shape_ledger.py index db17e4f8..7bdb78be 100644 --- a/src/grimoire/services/shape_ledger.py +++ b/src/grimoire/services/shape_ledger.py @@ -1798,7 +1798,7 @@ def _semantic_priority(row) -> tuple: # were examined under, so a tightened rule re-examines everything once. A # change that does not alter what is proposed needs no bump. A stale "miss" # basis on an old row is inert: a miss is not evidence (see _SEMANTIC_LIMIT). -_PROPOSER_VERSION = 7 +_PROPOSER_VERSION = 8 # Signature resemblance floor, name blanked (difflib ratio) — and a length # floor, because `def NAME():` resembles `def NAME(x):` at 0.95 while saying # nothing; a family shape has parameters to resemble. @@ -1939,7 +1939,9 @@ def names_canon( unless the canon is recorded in this very file; - never a generic verb, with or without a leading underscore; - a bare lowercase word (`file`, `seen`, `seal`) only where it is called - as `word(`, because as a plain word it is everyone's variable. + as `word(`, because as a plain word it is everyone's variable. No space + is allowed before the parenthesis: formatted code never has one, and + prose does ("a file (not a directory)"). Same kind and language family are checked by the callers' loops.""" sym = _norm_symbol(canon.symbol or "") if not sym: @@ -1954,7 +1956,7 @@ def names_canon( if not any(lp and _path_touches(lp, path) for lp, _ls in canon.locations): return False if kind == "sym" and re.fullmatch(r"[a-z]+", sym): - return re.search(rf"(?