From 39e6e2f9e44bd9afdf4c62f43a297ea69172fcf0 Mon Sep 17 00:00:00 2001 From: Umut CAN Date: Tue, 22 Sep 2026 13:38:14 +0300 Subject: [PATCH] =?UTF-8?q?docs(settings):=20track=20E=20shipped=20?= =?UTF-8?q?=E2=80=94=20CLAUDE.md=20sections=2018-20,=20README,=20changelog?= =?UTF-8?q?=20with=20the=20live=20COM=20smoke=20record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CLAUDE.md gains items 18-20 (styles, page setup & templates, environment), the grown drawing_settings facade on item 11, lean 55 / 52 and TOOL_PACKS=all|core,pid,settings, and three conventions: layer states are ours (ACADMCP_LAYERSTATES XRECORD, mode "xrecord"), page-setup evidence is the PDF's own /MediaBox, nothing interprets coordinates in UCS. README token table re-measured on this tree with benchmarks/token_suite.py (ratio/v1 estimates): full 199 tools / 59,315 tokens, core,settings 190 / 55,593, core 168 / 48,825, lean 55 / 16,360, search 2 / 356; corpus re-derived from discovery.aliases: 186 AutoCAD command names, 933 synonym phrases, 204 tools. Styles & standards row, page setup & templates row, final environment wording, and "Known limitations of the settings track". CHANGELOG Unreleased: the track E intro, Added (styles, page setup & templates, environment, drawing_settings growth, benchmark evidence), Fixed (the Track A hardening list), Changed (three groups, packs, measured idle cost, release snapshot 204 · 8 · 5 · 3284). Spec status: implemented. Where the plan's text and the tree disagreed, the tree wins: mleaderstyle_create is implemented on both engines through the ACAD_MLEADERSTYLE dictionary and no `mleaderstyle` capability key exists (spec §4, capability maps), so the docs say so instead of calling it ezdxf-only; the Task 7 fix (tolerant ACADMCP_PID payloads, crossings tested against the arc) joins the hardening list the plan left it out of. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd --- CHANGELOG.md | 112 ++++++++++++++++-- CLAUDE.md | 14 ++- README.md | 30 +++-- .../specs/2026-09-16-v1.6-settings-design.md | 4 +- 4 files changed, 132 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e44aba1..7ce53a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,68 @@ implements, six critique focuses that join `drawing_finalize`, and a `TOOL_PACKS` gate so a mechanical-only client never pays for the P&ID surface. Spec: `docs/superpowers/specs/2026-09-15-v1.6-pid-design.md`. +Track E of 1.6: the environment a drawing lives in. 38 tools in three new +sections — styles (18), page setup and templates (19), environment (20) — +the `drawing_settings` facade grown, a system-variable catalog, five bundled +templates, several open documents headlessly, portable layer states, named +views and UCS, and the live-only group (launch, preferences, document +properties, operator prompts) refused honestly headlessly. Spec: +`docs/superpowers/specs/2026-09-16-v1.6-settings-design.md`. + ### Added +- **Styles — 10 tools, pack `core`.** `dimstyle_list/create/modify/set_current`, + `textstyle_list/create/set_current`, `mleaderstyle_list/create`, + `drawing_apply_standard`. ISO-25 and ANSI (metric) presets are authored data + pinned by `tests/test_standards_presets.py` against ISO 129-1 / ASME Y14.2 + (DIMTXT 2.5 / 3.0, DIMASZ 2.5 / 3.0, DIMEXO 0.625 / 1.5, DIMDSEP `,` / `.`, + DIMTAD 1 / 0 …). `dimstyle_modify` accepts the 33-name whitelist only (the + 17 preset variables plus 16 more — `DIM_VARIABLE_WHITELIST`) and + refuses an out-of-range value by name before writing; `changed` lists what + moved. A font neither bundled nor on the engine's font path is written and + reported `font_resolved: false`, never refused. `mleaderstyle_create` works + on both engines: ActiveX exposes no MLeaderStyle *collection*, but the + `ACAD_MLEADERSTYLE` dictionary holds full `IAcadMLeaderStyle` objects, so + the live engine creates the style through `AddObject` and the property + writes — no `mleaderstyle` capability key exists. +- **Page setup & templates — 6 tools, pack `core`.** `page_setup_list/apply` + (`PAPER_SIZES` ISO A0–A4 / ANSI A–E, `CTB_CATALOG`, `SCALES`), `plot_style_list` + (catalog + installed), `batch_plot` — `mediabox_mm` parsed from each PDF's + `/MediaBox`, so `ISO_A3` landscape is 420 × 297 because the file says so — + `drawing_template_list`, `drawing_template_save` (`.dwt` refused headlessly, + capability `dwt_write`). Five bundled templates built by + `scripts/build_templates.py` through the server's own methods (`--check` + proves the DXFs byte-reproducible); their `.dwt` twins were built once on + AutoCAD 2026 by the smoke. `drawing_new(template="iso_a3_mech")` resolves the + bundled file and reports `{name, source}`. +- **Environment — 22 tools, pack `settings`.** `document_list/activate/close` + on both engines (the headless backend keeps a document registry; + `drawing_close` is the active-document case); `layer_state_save/restore/ + list/delete` as portable XRECORD snapshots — restore applies only the + requested `properties`, reports `missing_layers` (skipped, never created) + and `new_layers` (untouched), and the state survives save/reopen; + `view_named_save/restore/list`; `ucs_list/set/restore` (non-orthogonal axes + refused with the measured angle; tool coordinates stay WCS); + `system_variable_describe` over a 90-entry catalog (`known: false` + nearest + names on a miss); `drawing_properties_get/set` (custom properties on both + engines, summary fields COM-only: `dwgprops`); `system_launch` + (`live_application`), `system_preferences_get/set` (whitelisted keys with + ranges, read-only keys refused by name, `old`/`new` reported: + `preferences`), `user_pick_point/select` and `system_prompt_message` + (`interactive_prompt`; a cancelled pick is `{cancelled: true}`, a + `COM_CALL_TIMEOUT` overrun is `timed_out`). +- **`drawing_settings` grows** by `limits`, `grid`/`grid_spacing`, + `snap`/`snap_spacing`, `ortho`, `polar`/`polar_angle`, `psltscale`, + `annotation_scale`, `linear_units`, `angular_units`, `dimstyle`, + `textstyle`; `system_set_variable` refuses an out-of-range value for a + catalogued name before writing. +- **Benchmark evidence.** `benchmarks/tasks_v4.py` adds `page_setup_truth`; + the correctness suite grows to 32 with `settings_dimstyle_iso25_values`, + `settings_layer_state_roundtrip`, `settings_pdf_mediabox_a3`. A/B against + `v1.5.1`: **26 / 32 → 32 / 32, six `miss → pass`, zero regressed**. + `scripts/smoke_settings_com.py` runs the track once against the live seat + (record below). + - **P&ID — 9 tools, pack `pid`.** - `pid_symbol_list` / `pid_symbol_insert`: a 43-symbol ISO 10628-2 / ISA-5.1 catalogue authored in code (11 valve bodies × 6 actuators, 6 @@ -93,6 +153,26 @@ surface. Spec: `docs/superpowers/specs/2026-09-15-v1.6-pid-design.md`. ### Fixed +- **Track A hardening** (`tests/test_track_a_hardening.py`; the remaining + review findings are filed with a disposition each in + `docs/analysis/track-a-review-backlog.md`): + - `entity_create_block_ref` of an undefined block name is refused before + writing (it returned a handle to a dangling INSERT). + - `block_explode` keeps ATTRIB text: each ATTRIB becomes a TEXT entity on + both engines instead of being dropped. + - `pid_from_spec` refuses a NaN coordinate before the transaction opens and + rolls back on `BaseException`, not only `Exception`. + - A signal line no longer receives a fabricated line number and label; the + reader reports `line_number: null` for it. + - A bubble's exit point honours the first waypoint instead of the port + direction. + - A foreign or hand-edited `ACADMCP_PID` payload is read tolerantly, and an + existing polyline with a bulge is tested as its arc, not its chord, so a + line through a crossing jump counts as a crossing. + - `block_insert` attribute values are validated as strings; an int or None + is a `TypeError` naming the tag, not `str()`-coerced. + - `block_define` refuses a NaN base point and a layer that does not exist + in the drawing (it wrote both and `drawing_audit` repaired them later). - **Headless `block_insert(attributes=…)` lost its ATTRIBs.** The ezdxf path used `add_auto_blockref`, which wraps the INSERT in an anonymous `*U` block: the handle it returned reported `block_name` `*U1`, and @@ -119,13 +199,21 @@ surface. Spec: `docs/superpowers/specs/2026-09-15-v1.6-pid-design.md`. ### Changed -- **`TOOL_PACKS=all|core,pid`** (default `all`) advertises only the vertical - packs a client uses; `core` is always on and unknown names are ignored - with a warning. It composes with `TOOL_PROFILE=lean` (which now carries - `pid_symbol_insert`, `pid_line_draw` and `pid_graph`: 50 tools, 47 with - `TOOL_PACKS=core`) and `ENABLE_3D`; `system_about` reports `tool_packs`. - Measured idle cost: 161 tools / 44,930 tokens by default, 152 / 41,420 - with `TOOL_PACKS=core`. +- Three tool groups appear in `system_about` and `docs/tool-inventory.json`: + `styles` (10), `page_setup` (6), `environment` (22) — 204 tools in 23 groups; + `LEAN_TOOL_NAMES` 55; capability keys `dwgprops`, `dwt_write`, + `live_application`, `preferences`, `interactive_prompt`, `registry_sysvar` + and the `documents`, `named_views`, `ucs` and `layer_states` + (`mode: "xrecord"`) features in both maps. +- **`TOOL_PACKS=all|core,pid,settings`** (default `all`) advertises only the + vertical packs a client uses; `core` is always on and unknown names are + ignored with a warning. It composes with `TOOL_PROFILE=lean` (which now + carries `pid_symbol_insert`, `pid_line_draw` and `pid_graph`, and the five + settings essentials: 55 tools, 52 with `TOOL_PACKS=core`) and `ENABLE_3D`; + `system_about` reports `tool_packs`. Measured idle cost: 199 tools / + 59,315 tokens by default, 190 / 55,593 with `TOOL_PACKS=core,settings`, + 168 / 48,825 with `TOOL_PACKS=core`, 55 / 16,360 lean, 2 / 356 in + discovery mode. - `PID_LAYERS` (`drawing_apply_iso_layers("pid")`) gains `PROCESS-LINE-TEXT`; `drawing_plan` / `drawing_preflight` report `LAYER_SET_INTENT_MISMATCH` when a P&ID intent is planned onto a non-`pid` layer set. @@ -134,11 +222,11 @@ surface. Spec: `docs/superpowers/specs/2026-09-15-v1.6-pid-design.md`. primitives. - `CritiqueFocus` grows by the six `pid_*` values; benchmark matrix v4 (`--matrix v3` / `v2` reproduce the earlier sets); correctness suite 29. -- README release snapshot: 166 tools · 8 resources · 5 prompts · 2423 - collected tests. The collected-test figure is this machine's; CI has not - run on this tree yet, and the pre-existing 1369-vs-1363 drift between the - README and Linux collection predates the track and is superseded by the - new figure. +- README release snapshot: 204 tools · 8 resources · 5 prompts · 3284 + collected tests (this machine; it was 166 · 2423 after track A). CI has + not run on this tree yet, and the pre-existing 1369-vs-1363 drift between + the README and Linux collection predates both tracks and is superseded by + the new figure. ### Live COM smoke diff --git a/CLAUDE.md b/CLAUDE.md index 7c797c1..4a66aff 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -82,17 +82,20 @@ Tools are organized into sections (counts are indicative — `system_about` is a 8. Analysis & Query (8 tools): `analysis_*` — plus Batch (2), Templates (2), Validation (1) 9. View & Screenshot (4 tools — includes `view_zoom_and_screenshot`): `view_*` 10. Transactions (3 tools): `transaction_begin/commit/rollback` -11. System (8 tools): `system_status/get_variable/set_variable/run_command/run_lisp/about/capabilities`, plus `drawing_settings` (friendly units/scale/precision/osnap facade over system variables) +11. System (8 tools): `system_status/get_variable/set_variable/run_command/run_lisp/about/capabilities`, plus `drawing_settings` (friendly units/scale/precision/osnap facade over system variables; the facade now also covers limits, grid/snap/ortho/polar, PSLTSCALE, annotation scale (`"1:50"`), linear/angular unit formats and the current dimstyle/textstyle, with unknown keys refused and every key reported on read) 12. Engineering / Deterministic CAD (8 tools): `gear_draw_*`, `keyway_draw_*`, `titleblock_apply_iso_a3`, `drawing_finalize` 13. Premium meta-tools (12): `drawing_preflight`, `drawing_plan`, `drawing_critique`, `drawing_refine`, `drawing_deliver`, `point_from_snap/intersection/tangent`, `construction_*`, `drawing_apply_iso_layers`, `dimension_auto`, `entity_select_smart` 14. GD&T (ISO 1101 / ASME Y14.5): `gd_frame` (feature control frames), `datum_feature` — enforced by the `gdt` critique focus 15. Layouts & Paper Space (12 tools): tab lifecycle `layout_list/create/set_current/delete/rename/copy`, viewports `viewport_create/list/set_scale/lock/delete`, and `entity_change_space` (CHSPACE — tagged `layout` *and* `modify`, and `layout` wins the group priority, so it files here). `drawing_export_pdf` takes an optional `layout` param and **does** project model content through viewports on both engines (`viewport_render` — v1.4 declared this COM-only and was wrong; the headless renderer only omits the viewport borders). `entity_change_space` is the mirror case — ezdxf-only (`chspace`), because ActiveX exposes no change-space member and the COM route is unverified. 16. 3D Solids (5 tools, opt-in via `ENABLE_3D=true`, COM only): `solid_box/cylinder/extrude/revolve/boolean` — hidden from discovery and rejected while disabled; ezdxf reports `solid_3d` as unsupported (no headless ACIS). 17. P&ID (9 tools, pack `pid`): `pid_symbol_list/insert` (ISO 10628-2 + ISA-5.1 catalogue authored in code, real blocks with TAG attributes, named ports, ACADMCP_PID XDATA), `pid_line_draw` (port-to-port orthogonal routing, ISA-5.1 line classes → layer/linetype/marker blocks, line numbers), `pid_tag_parse` (ISA-5.1 grammar), the reader `pid_graph` and its deliverables `pid_instrument_index/line_list/equipment_list`, and `pid_from_spec` (whole sheet, one transaction). Six `pid_*` critique focuses (`pid_dangling_line`, `pid_duplicate_tag`, `pid_incompatible_connection`, `pid_untagged_instrument`, `pid_illegal_tag`, `pid_unconnected_equipment`) run under `focus=None` and inside `drawing_finalize`; they return nothing on a drawing without P&ID nodes. Two resources (`autocad://pid/symbols`, `autocad://standards/isa51`) carry the catalogue and the ISA-5.1 letter tables. Both engines implement every P&ID contract; the COM paths were executed live once by `scripts/smoke_pid_com.py` (AutoCAD 2026). +18. Styles (10 tools, pack `core`): `dimstyle_list/create/modify/set_current` (authored ISO-25 / ANSI presets from `engineering/standards/dimstyles.py`; `dimstyle_modify` accepts only `DIM_VARIABLE_WHITELIST` names (33) and refuses out-of-range values by name before writing; `changed` lists only variables that moved, and `rerender_required: true` says a headless DIMENSION keeps its rendered block until redrawn), `textstyle_list/create/set_current` (`font_resolved: false` is reported, never refused — DXF stores only the name), `mleaderstyle_list/create` (both engines: ezdxf on `doc.mleader_styles`, live through the `ACAD_MLEADERSTYLE` dictionary — ActiveX has no MLeaderStyle *collection*, which is not an engine boundary, so no `mleaderstyle` capability key exists), and `drawing_apply_standard("iso"|"ansi")` — dimstyle + text style + units + the `mech` layer set in one call, each item reporting `created` or already present. +19. Page setup & templates (6 tools, pack `core`): `page_setup_list/apply` (ISO 216 / ANSI Y14.1 sizes from `PAPER_SIZES`; an unknown ctb is written and reported `plot_style_known: false`), `plot_style_list` (catalog + the files actually installed on a live seat), `batch_plot` (every paper layout through `drawing_export_pdf(layout=)`; `mediabox_mm` is **read back from the PDF's own `/MediaBox`**, so the sheet size is verified, not assumed), `drawing_template_list` (the five bundled templates: `iso_a3_mech`, `iso_a1_arch`, `iso_a3_pid`, `ansi_b_mech`, `ansi_d_arch` — DXF headless, `.dwt` twin on COM, `scripts/build_templates.py --check` proves the DXFs reproducible), `drawing_template_save` (a `.dwt` request headlessly is refused with capability `dwt_write` naming the DXF route). `drawing_new(template=)` resolves a catalog name to the bundled file and reports `template: {name, source}`. +20. Environment (22 tools, pack `settings`): documents `document_list/activate/close` (both engines — the headless backend keeps a document registry; `document_close` refuses to discard unsaved work unless `discard=True`), layer states `layer_state_save/restore/list/delete` (portable: JSON chunks in an `ACADMCP_LAYERSTATES` XRECORD that travels with the file and **does not appear in AutoCAD's Layer States Manager** — `system_capabilities.layer_states` says so), named views `view_named_save/restore/list` (headless restore writes `$VIEWCTR/$VIEWSIZE` and reports `applied: "header_only"`), UCS `ucs_list/set/restore` (non-orthogonal axes refused with the measured angle; **tool coordinates stay WCS** — a UCS is stored for the operator, no tool interprets input in it), `system_variable_describe` (the 90-entry `SYSVAR_CATALOG`; an unknown name answers `known: false` plus nearest names, never an error; `system_set_variable` now refuses an out-of-range value for a catalogued name before writing), `drawing_properties_get/set` (custom properties on both engines through `$CUSTOMPROPERTYTAG`; the five summary fields are COM-only, capability `dwgprops`), and the live-only group `system_launch` (`live_application`), `system_preferences_get/set` (`preferences`; a whitelist of `Preferences.*` keys with ranges, read-only keys refused by name, writes report `old`/`new`), `user_pick_point/select`, `system_prompt_message` (`interactive_prompt`; a cancelled pick returns `{cancelled: true}`, a `COM_CALL_TIMEOUT` overrun reports `timed_out`). The COM paths were executed live once by `scripts/smoke_settings_com.py` (AutoCAD 2026), which also built the `.dwt` twins. -**Tool profiles:** `TOOL_PROFILE=lean|full` (default `full`) controls the advertised surface — `lean` ≈ 50 curated drafting tools (47 with `TOOL_PACKS=core`; including `cad_batch`, since a client with a tight tool cap is exactly the client paying most per turn). Applied in the lifespan; reported by `system_about`. The `core` profile was removed in v1.5.0 (the discovery layer replaced it); `TOOL_PROFILE=core` falls back to `full` with a warning. +**Tool profiles:** `TOOL_PROFILE=lean|full` (default `full`) controls the advertised surface — `lean` = 55 curated drafting tools (52 with `TOOL_PACKS=core`; the five settings essentials — `drawing_apply_standard`, `dimstyle_set_current`, `textstyle_set_current`, `page_setup_apply`, `batch_plot` — are core-pack tools and stay; including `cad_batch`, since a client with a tight tool cap is exactly the client paying most per turn). Applied in the lifespan; reported by `system_about`. The `core` profile was removed in v1.5.0 (the discovery layer replaced it); `TOOL_PROFILE=core` falls back to `full` with a warning. -**Tool packs:** `TOOL_PACKS=all|core,pid` (default `all`) advertises only the vertical packs a client uses; `core` is always on and is everything no other pack claims; unknown names are ignored with a warning; a `lean` profile intersects with the enabled packs. `system_about` reports `tool_packs`. +**Tool packs:** `TOOL_PACKS=all|core,pid,settings` (default `all`) advertises only the vertical packs a client uses; `core` is always on and is everything no other pack claims; `settings` is the 22 SECTION 20 environment tools, `pid` the nine P&ID tools; SECTION 18/19 are core; unknown names are ignored with a warning; a `lean` profile intersects with the enabled packs. `system_about` reports `tool_packs`. **Tool discovery:** `DISCOVERY_MODE=off|search` (default `off`). `search` replaces the advertised catalog with `search_tools` + `call_tool`, ranking hits over an AutoCAD command / synonym corpus (`discovery/aliases.py`) layered on fastmcp's BM25 index. @@ -131,7 +134,10 @@ Tools are organized into sections (counts are indicative — `system_about` is a - **Engineering layer scaffold**: `drawing_new` auto-bootstraps standard linetypes (CENTER, HIDDEN, PHANTOM) and engineering layers (GEOMETRY, DIM, CENTER, HIDDEN, PHANTOM, HATCH, TEXT, TITLEBLOCK). Pass `bootstrap=False` to opt out. - **Generic contracts added in 1.6:** `block_define(name, entities, attdefs)` (typed primitives + ATTDEFs, both engines; `overwrite` replaces contents so INSERTs keep the name) and `entity_get/set_xdata` (typed by group code; 255-char strings, 16 KB per entity, enforced before writing). - **P&ID reader rules:** `pid_graph` never modifies the drawing, reads geometry from the drawing (an INSERT's real rotation/scale) rather than the catalogue, and reports `source`/`confidence` per node (catalog 1.0, xdata 0.95, heuristic 0.6, inferred 0.3) — never raised by agreement between heuristics. Read `stats.confidence_min` before trusting a foreign drawing. -- **`TOOL_PACKS=all|core,pid`** advertises only the packs a client uses; `core` is always on; `system_about` reports `tool_packs`. +- **`TOOL_PACKS=all|core,pid,settings`** advertises only the packs a client uses; `core` is always on; `system_about` reports `tool_packs`. +- **Layer states are ours, not AutoCAD's.** `layer_state_*` stores a portable snapshot in an `ACADMCP_LAYERSTATES` XRECORD; it survives save/reopen on both engines and travels with the file, and it is not listed in AutoCAD's Layer States Manager. Said in the tool docstring, in `system_capabilities.layer_states` (`mode: "xrecord"`, reason `portable_acadmcp_xrecord;not_listed_in_autocad_layer_states_manager`) and in the README. +- **Page-setup evidence is the PDF.** `batch_plot` reports `mediabox_mm` parsed from the file's `/MediaBox` (`engineering/standards/pdfinfo.py`); a page setup is verified by what a printer would get, not by the setter's return value. A style or setting write reports `changed` — re-setting a value to itself is not a change. +- **Nothing interprets coordinates in UCS.** `ucs_set` / `ucs_restore` store and activate a UCS for the operator's benefit; every tool input and output stays WCS (the repository rule above). - **Production drawings**: For real engineering output, use the `engineering/` package primitives via the `gear_*` / `keyway_*` / `titleblock_*` MCP tools — do NOT hand-draw teeth/keyways/sections with raw `entity_create_*` calls. Always end with `drawing_finalize` for the 8-step validator. ### Premium Drawing Rules diff --git a/README.md b/README.md index 9ef720c..6d056a1 100644 --- a/README.md +++ b/README.md @@ -33,15 +33,16 @@ Live through COM on Windows, or headless through ezdxf anywhere — one typed co ## Why this exists -**A big MCP server is expensive to be connected to.** The full catalog costs a client **44,930 tokens** before it has asked for anything. Discovery mode replaces it with two tools and costs **356**. +**A big MCP server is expensive to be connected to.** The full catalog costs a client **59,315 tokens** before it has asked for anything. Discovery mode replaces it with two tools and costs **356**. -**A drafter searches for `FILLET`, not `entity_fillet`.** Those command names appeared in no tool name or description — `df = 0` against a stock index, not badly ranked but *absent*. The fix was data: an authored corpus of **162 AutoCAD command names and 731 synonym phrases** covering all 166 tools. A test refuses to let a tool exist without one. +**A drafter searches for `FILLET`, not `entity_fillet`.** Those command names appeared in no tool name or description — `df = 0` against a stock index, not badly ranked but *absent*. The fix was data: an authored corpus of **186 AutoCAD command names and 933 synonym phrases** covering all 204 tools. A test refuses to let a tool exist without one. | Advertised surface | Tools seen | Idle cost | |---|---:|---:| -| `TOOL_PROFILE=full` (default) | 161 | 44,930 tokens | -| `TOOL_PACKS=core` (full profile) | 152 | 41,420 tokens | -| `TOOL_PROFILE=lean` | 50 | 14,007 tokens | +| `TOOL_PROFILE=full` (default) | 199 | 59,315 tokens | +| `TOOL_PACKS=core,settings` (full profile) | 190 | 55,593 tokens | +| `TOOL_PACKS=core` (full profile) | 168 | 48,825 tokens | +| `TOOL_PROFILE=lean` | 55 | 16,360 tokens | | `DISCOVERY_MODE=search` | 2 | **356 tokens** | > [!NOTE] @@ -101,11 +102,12 @@ Claude Desktop, Cursor, or any stdio MCP host. For HTTP: `autocad-mcp --transpor | Annotation | ISO 129 toleranced dimensions, ISO 286 fits (`fit="H7"`), TABLE, MLEADER, GD&T frames and datums (ISO 1101) | | Engineering generators | involute gears (front + section A-A), DIN 6885 keyed bores, ISO A3 title block | | P&ID | catalogue blocks with ports and tags (ISO 10628-2 / ISA-5.1), port-to-port lines with ISA-5.1 classes and line numbers, `pid_graph` reads any P&ID back with confidence, instrument index / line list / equipment list, `pid_from_spec` one-call sheets | -| Discovery | `search_tools` ranked over an AutoCAD command and synonym corpus — `FILLET`, `BPOLY`, `QSELECT`, `WBLOCK`, `OVERKILL`, `CHSPACE` each rank **#1** of the 161-tool advertised catalog | +| Styles & standards | ISO-25 / ANSI dimension styles, ISOCP / ROMANS text styles, ISO / ANSI leader styles from authored presets; `drawing_apply_standard("iso")` sets all of it plus units and the `mech` layers in one call; `changed` reports only what moved | +| Discovery | `search_tools` ranked over an AutoCAD command and synonym corpus — `FILLET`, `BPOLY`, `QSELECT`, `WBLOCK`, `OVERKILL`, `CHSPACE` each rank **#1** of the 199-tool advertised catalog | | Batching | `cad_batch` runs a step list in one round trip; `fields=` projects 11 result-heavy tools | | Paper space | tab lifecycle, viewports, `entity_change_space` (CHSPACE), `page_setup_apply` (ISO 216 / ANSI Y14.1 paper, ctb, scale, device — on both engines), `batch_plot` with every sheet size read back from its PDF's `/MediaBox`, `drawing_export_pdf(layout=…)` | -| Templates | five bundled templates built by the server's own tools and pinned reproducible (`iso_a3_mech`, `iso_a1_arch`, `iso_a3_pid`, `ansi_b_mech`, `ansi_d_arch`) — `drawing_new(template="iso_a3_mech")`, `drawing_template_list`, `drawing_template_save` (.dwt on live AutoCAD, `dwt_write` refused headlessly) | -| Environment | `document_list/activate/close` — several drawings open at once on both engines; portable layer states (`ACADMCP_LAYERSTATES` XRECORDs — in the file, not in AutoCAD's Layer States Manager); named views; UCS stored and made current *(tool coordinates stay WCS)*; live only: launch/attach, a preference whitelist (`OPTIONS`), and operator prompts — pick a point, select on screen, a command-line message — where ESC is `cancelled`, not an error | +| Page setup & templates | ISO 216 / ANSI Y14.1 sheets, ctb catalog, `batch_plot` verified by the PDF's own `/MediaBox`, five bundled templates built by the server's own tools and pinned reproducible (`drawing_new(template="iso_a3_mech")`, `iso_a1_arch`, `iso_a3_pid`, `ansi_b_mech`, `ansi_d_arch`), save any drawing as a template (`.dwt` on live AutoCAD, `dwt_write` refused headlessly) | +| Environment | several open documents headlessly, portable layer states (`ACADMCP_LAYERSTATES` XRECORDs — in the file, not in AutoCAD's Layer States Manager), named views, UCS *(tool coordinates stay WCS)*, a system-variable catalog with ranges, document properties, and on a live seat: launch/attach, preferences, an operator prompt / pick / select — where ESC is `cancelled`, not an error | | Selection | window vs crossing stated back to the caller; a polygon tested against its own shape, not its bounding box | | Boundaries | `boundary_trace` (BOUNDARY/BPOLY) chains loose edges into one closed polyline, arcs kept as bulges *(headless)* | | Measurement | `analysis_measure_entity` measures what is *in* the drawing, by handle | @@ -171,7 +173,7 @@ An earlier matrix scored this server 10/10, which carried no information: every | Task | Verified against | |---|---| | `tool_discovery` | six AutoCAD command names, each ranking #1 | -| `token_budget` | 44,930 → 356 tokens, against a ceiling fixed in advance | +| `token_budget` | 59,315 → 356 tokens, against a ceiling fixed in advance | | `hatch_islands` | 300 filled with the island, 400 ignoring it | | `selection_filter` | window 1, crossing 2, bounding box 3, polygon 1 | | `measure_from_handle` | 139.2699 against the 100.0 a vertex shoelace gives | @@ -206,6 +208,14 @@ A page that only lists strengths is a page that has not been measured. **Same-file only, DXF headlessly.** Off-page connectors link within one drawing; links across files are not resolved. The headless engine reads DXF; a DWG P&ID is read through the live backend. No DEXPI/Proteus export and no ISA-5.2 binary-logic symbols in this release, recorded in the spec so nobody re-derives the cut. +### Known limitations of the settings track + +**Layer states are ours.** `layer_state_save` writes a portable snapshot into an `ACADMCP_LAYERSTATES` XRECORD. It survives save/reopen on both engines and travels with the DWG/DXF; it is **not** an AutoCAD `LAYERSTATE` and does not appear in the Layer States Manager. `system_capabilities` reports `layer_states` as `mode: "xrecord"` for that reason. + +**Six of the 22 environment tools need a live seat.** Preferences, launching, the operator prompts, and the five summary fields of document properties are refused headlessly with `preferences` / `dwgprops` / `live_application` / `interactive_prompt` — a refusal, not a stub. A `.dwt` template is the same case (`dwt_write`): a `.dwt` is a DWG container, so headlessly the template is saved as DXF. `mleaderstyle_create` is *not* such a case — ActiveX has no MLeaderStyle collection, but the `ACAD_MLEADERSTYLE` dictionary holds full `IAcadMLeaderStyle` objects, so both engines create leader styles. + +**A headless dimension does not re-render.** `dimstyle_modify` reports `dimensions_using_style` and `rerender_required: true` on the ezdxf engine; the DIMENSION keeps its rendered block until it is redrawn. AutoCAD regenerates on the next regen. + ## Configuration Nothing loads a `.env` file — export these, or set them in your MCP client's `env` block. @@ -217,7 +227,7 @@ Nothing loads a `.env` file — export these, or set them in your MCP client's ` |---|---|---| | `AUTOCAD_MCP_BACKEND` | `auto` | `auto`, `com`, or `ezdxf` | | `CAD_PROGID` | `AutoCAD.Application` | COM ProgID the live backend attaches to | -| `TOOL_PROFILE` | `full` | `lean` (50 curated tools) or `full` | +| `TOOL_PROFILE` | `full` | `lean` (55 curated tools, 52 with `TOOL_PACKS=core`) or `full` | | `TOOL_PACKS` | `all` | Vertical packs to advertise: `core,pid,settings` (`core` always on) | | `DISCOVERY_MODE` | `off` | `search` replaces the catalog with `search_tools` + `call_tool` | | `ENABLE_3D` | `false` | Expose the opt-in `solid_*` tools (COM) | diff --git a/docs/superpowers/specs/2026-09-16-v1.6-settings-design.md b/docs/superpowers/specs/2026-09-16-v1.6-settings-design.md index 62b19ab..0e8fcf3 100644 --- a/docs/superpowers/specs/2026-09-16-v1.6-settings-design.md +++ b/docs/superpowers/specs/2026-09-16-v1.6-settings-design.md @@ -1,7 +1,7 @@ # v1.6 Track E — AutoCAD settings and environment -**Date:** 2026-09-16 · **Status:** design approved in conversation; plan at -`docs/superpowers/plans/2026-09-16-v1.6-settings-implementation.md` · **Parent:** +**Date:** 2026-09-16 · **Status:** implemented 2026-09-22 (26 tasks of +`docs/superpowers/plans/2026-09-16-v1.6-settings-implementation.md`; live COM smoke on AutoCAD 2026 recorded in `CHANGELOG.md` Unreleased, `.dwt` twins built by it; A/B vs v1.5.1 32 / 32) · **Parent:** `2026-09-15-v1.6-roadmap-design.md` (track E) · **Baseline:** main after Track A (166 tools, 8 resources)