feat(arch): arch_plan_from_spec, three arch_* critique focuses, the arch pack, lean 64 and the counts

The three track-F branches are merged; this is the integration that makes the
twelve SECTION 25 tools one surface.

- engineering/arch/spec.py: a whole plan from one document - walls with their
  openings, stairs, room labels measured off the walls just drawn, the
  exterior chains and the schedules - inside one transaction. Everything the
  model, the wall engine or the stair symbol can refuse is refused before the
  transaction opens, by path; a room point in no closed face rolls it back,
  and so does a cancelled request, under the anyio shield of pid/spec.py.
  EXAMPLE_SPEC's rooms measure 4825 x 5750 and 3825 x 5750 - the net floor,
  computed by hand in the tests.
- engineering/arch/critique.py: arch_room_unlabelled, arch_wall_gap (50 mm,
  one issue per pair of walls, measured to the wall body so an L corner and a
  T stem both read as joined) and arch_opening_clash. One index per critique
  run; a drawing without an ACADMCP_ARCH record yields nothing. Each focus
  has a positive and a negative fixture.
- TOOL_PACK_NAMES gains "arch" (the twelve SECTION 25 tools); lean gains
  arch_wall, arch_opening, arch_room and arch_plan_from_spec and reaches 64;
  the arch tag ranks after mech, so SECTION 25 files as one `architecture`
  group - 241 tools in 26 groups.
- Six golden tuning cases, two of them Turkish, the arch_plan_from_spec alias
  record, the shared-command allowlist reconciled with what the merged records
  claim, the inventory regenerated, the registry snapshot retaken, and the
  README figures taken from check_doc_numbers rather than typed.
- Two more Turkish golden cases close the reconciliation's alias gaps
  ("vaziyet planı çiz" -> arch_plan_from_spec, "oda alanlarını hesapla" ->
  arch_rooms_detect); the arch records carry vaziyet / alan / oda / kat planı
  in diacritic and ASCII-folded spellings, because the search tokenizer splits
  on a non-ASCII letter. BOUNDARY and AREA stay with boundary_trace and
  analysis_measure_entity on purpose, recorded in the arch alias comment.
  Tuning top-1 73/84, top-3 83/84; holdout top-3 15/15.
- tests/test_token_suite.py: TOOL_PACKS=core,mech now drops the arch pack
  too (measured 193 = 236 - 9 - 22 - 12).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
This commit is contained in:
Umut CAN
2026-09-23 23:20:05 +03:00
co-authored by Claude Opus 5.5
parent ad5a32a34a
commit 6e004cc658
14 changed files with 1440 additions and 57 deletions
+56 -2
View File
@@ -62,7 +62,8 @@ class ToolAliases:
# splits read and write.
# ERASE, INSERT -- the server genuinely exposes one operation through more
# than one tool (single vs. batch delete; block insert vs. block-reference
# creation vs. the P&ID catalogue insert), so each is a correct destination.
# creation vs. the P&ID, standard-parts and furniture / sanitary
# catalogue inserts), so each is a correct destination.
# QSELECT -- AutoCAD's Quick Select dialog is both "filter by properties"
# (selection_filter) and "find things like this one"
# (entity_select_smart); a drafter typing it could mean either.
@@ -508,6 +509,7 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"what is wrong with this drawing",
"drafting mistakes",
"check before finalising",
"anything wrong before i finish",
),
),
"drawing_deliver": ToolAliases(
@@ -2240,6 +2242,8 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"exterior wall",
"partition wall",
"floor plan walls",
"walls of a floor plan",
"draw the walls",
"clean wall corners",
"t junction of walls",
"wall poche",
@@ -2309,7 +2313,12 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
# AREA and BOUNDARY stay with analysis_measure_entity and boundary_trace:
# on a plain AutoCAD seat a drafter typing them means those tools, and
# sharing them would move the golden BPOLY / area cases. The room
# vocabulary below reaches these two without either command.
# vocabulary below reaches these two without either command. Task 9's
# reconciliation of the merged records kept that decision on purpose:
# neither command goes into SHARED_ACAD_COMMANDS and neither moves to an
# arch_* record. The Turkish room vocabulary ("oda", "alan", "oda alanları")
# carries both spellings, diacritic and ASCII-folded, because the search
# tokenizer splits on a non-ASCII letter instead of folding it.
"arch_room": ToolAliases(
acad=(),
synonyms=(
@@ -2318,8 +2327,12 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"room name and number",
"net floor area",
"measured room area",
"oda",
"oda etiketi",
"oda alanı",
"oda alani",
"alan",
"mahal adı",
"mahal adi",
),
),
@@ -2331,7 +2344,18 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"rooms of a floor plan",
"room areas of this plan",
"read rooms from lines",
"oda",
"odalar",
"odaları bul",
"odalari bul",
"alan",
"oda alanları",
"oda alanlari",
"oda alanlarını hesapla",
"oda alanlarini hesapla",
"alan hesabı",
"alan hesabi",
"kat planı alanları",
"kat plani alanlari",
),
),
@@ -2342,7 +2366,14 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"window schedule",
"room schedule",
"opening schedule",
"kapı çizelgesi",
"kapi cizelgesi",
"kapı listesi",
"kapi listesi",
"pencere listesi",
"kapı pencere listesi",
"kapi pencere listesi",
"pencere çizelgesi",
"pencere cizelgesi",
"mahal listesi",
),
@@ -2411,6 +2442,29 @@ TOOL_ALIASES: dict[str, ToolAliases] = {
"gorunus isareti",
),
),
# ── Architecture: the whole plan (SECTION 25, track F integration) ──────
"arch_plan_from_spec": ToolAliases(
acad=(),
synonyms=(
"draw a floor plan",
"whole floor plan from a spec",
"plan with walls doors and windows",
"draw a house plan",
"apartment plan",
"two room plan",
"architectural plan in one go",
"kat planı",
"kat plani",
"kat planı çiz",
"kat plani ciz",
"vaziyet",
"vaziyet planı",
"vaziyet plani",
"vaziyet planı çiz",
"vaziyet plani ciz",
"mimari plan",
),
),
}