Files
autocad-mcp-pro/docs/analysis/track-a-review-backlog.md
T
Umut CANandClaude Opus 5 d313da783a docs(analysis): Track A review backlog — every minor finding with a disposition
Waves 1-4 of the Track A review produced ~170 minor findings that lived
only in the orchestrator's scratchpad. Filed de-duplicated, one line each:
fixed-in-task-N (this track's hardening tasks), fixed-in-track-A (with the
commit), accepted-limitation (with the reason) or deferred-1.7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
2026-09-22 11:08:04 +03:00

29 KiB
Raw Blame History

Track A (v1.6 P&ID) — review backlog

Source: the plan-compliance and adversarial review rounds of Track A (2026-09-15/16), waves 1–4. Blocking findings were fixed inside Track A (fix(task-N) commits) and are not listed. Every minor finding is here, de-duplicated, with one disposition:

  • fixed-in-task-N — Track E group H (docs/superpowers/plans/2026-09-16-v1.6-settings-implementation.md, Tasks 1–7)
  • fixed-in-track-A — resolved on main by a later Track A commit (evidence cited)
  • accepted-limitation — kept as is, with the reason
  • deferred-1.7 — a real item for the 1.7 roadmap

Reading key: W1-T1-03 = wave 1, Track A Task 1, finding 3. Files are repository-relative.

Wave 1

Track A Task 1 — block_insert(attributes=…) (ezdxf)

ID File Finding Disposition
W1-T1-01 backends/ezdxf_backend.py The undefined-block gate (6f4bda5) was added without being listed as a deviation. accepted-limitation (reporting gap; the gate is kept and shared by Task 1)
W1-T1-02 plan Branch forked before the docs commits; no code diverged. accepted-limitation (process; merged clean)
W1-T1-03 backends/ezdxf_backend.py attributes was coerced after add_blockref, so a non-mapping failed after the write and skipped _mark_dirty. fixed-in-task-3
W1-T1-04 backends/ezdxf_backend.py str(v) wrote Python reprs (None, True, a dict) into ATTRIBs on both engines. fixed-in-task-3
W1-T1-05 backends/ezdxf_backend.py Tag matching is exact-case; {"tag": …} silently drops against ATTDEF TAG. deferred-1.7 (normalise keys to upper case; the server's own ATTDEF tags are upper-case by ATTDEF_TAG_RE)
W1-T1-06 backends/ezdxf_backend.py *Model_Space / *Paper_Space pass the existence check and insert a reference cycle. fixed-in-task-1
W1-T1-07 backends/ezdxf_backend.py entity_create_block_ref still accepts an undefined block; doc.audit() deletes the INSERT later. fixed-in-task-1
W1-T1-08 tests/test_block_insert_attributes.py attributes=None yields no ATTRIBs headlessly while COM's InsertBlock instantiates ATTDEF defaults; refusal types diverged (ValueError vs RuntimeError). refusal type: fixed-in-task-1 (COM raises the same ValueError); default ATTRIBs: deferred-1.7 (engine divergence on ATTDEF defaults)
W1-T1-09 backends/ezdxf_backend.py block_explode drops the ATTRIB text. fixed-in-task-2

Track A Task 2 — backends/block_specs.py

ID File Finding Disposition
W1-T2-01 security.py illegal_symbol_name_chars added outside the task's file list, unreported. accepted-limitation (reporting gap; harmless, tested)
W1-T2-02 backends/block_specs.py fullmatch, layer-character gate and _one_line are stricter than the plan stated. accepted-limitation (all serve the validate-before-write rule; pinned by tests)
W1-T2-03 plan / spec Spec §4.7 per-entity color/linetype/lineweight overrides were dropped by the plan; unknown keys are silently ignored. deferred-1.7 (carry the three keys through or refuse unknown keys by index)
W1-T2-04 backends/block_specs.py _scalar let 10**400 escape as OverflowError instead of the named TypeError. fixed-in-task-4
W1-T2-05 backends/block_specs.py A non-list entities (dict, str, generator) is refused as "empty". deferred-1.7
W1-T2-06 backends/block_specs.py _layer gates characters but not the 255-char length rule. deferred-1.7
W1-T2-07 backends/block_specs.py Refusal messages echo the caller's value unbounded (got {value!r}; measured 2 MB messages). deferred-1.7 (truncate with reprlib)
W1-T2-08 backends/block_specs.py Same as W1-T2-03 (unknown keys such as rotation silently dropped). deferred-1.7 (with W1-T2-03)

Track A Task 6 — ISA-5.1 tag grammar

ID File Finding Disposition
W1-T6-01 engineering/pid/tags.py Three grammar changes (X user-defined, no output after V, O/C only after ZS) unreported. accepted-limitation (the fixture is the contract; documented in describe_tables()['rules'])
W1-T6-02 engineering/pid/tags.py Two of those go past the spec §8 wording. accepted-limitation (spec text to be reconciled by the 1.7 docs pass)
W1-T6-03 spec Spec example meanings (Flow rate/Indicate/Control) differ from the tables (Flow/Indicator/Controller). accepted-limitation (keys match; consumers pin the tables)
W1-T6-04 engineering/pid/tags.py The "unexpected letter" error names the first trailing letter, not the offender (LAHX-1 → reports H). deferred-1.7
W1-T6-05 engineering/pid/tags.py equipment_prefixes={} falls back to the default map (or instead of is None); non-string values pass through. deferred-1.7 (also W4-T19-05)
W1-T6-06 tests/data/isa51_tags.json No fixture row for K (rate of change / control station), M trailing, O readout, B/N/X user-defined readouts. deferred-1.7 (≈5 rows)
W1-T6-07 engineering/pid/tags.py O/C trailing narrowed to Z-first tags beyond the spec text. accepted-limitation (documented resolution of a spec/fixture conflict)

Track A Task 12 — engineering/pid/lines.py

ID File Finding Disposition
W1-T12-01 engineering/pid/lines.py axis_direction, the string.Formatter parser and finiteness checks were added unreported. accepted-limitation (reporting gap; pinned by tests)
W1-T12-02 engineering/pid/__init__.py Created outside the task's file list (branch predated Task 5). accepted-limitation (byte-identical to Task 5's)
W1-T12-03 engineering/pid/lines.py direct and waypoint modes accept a negative / NaN stub. deferred-1.7 (hoist the stub check above the mode branch)
W1-T12-04 engineering/pid/lines.py A malformed waypoint ({"x":…}, a flat list) escapes as KeyError / TypeError instead of ValueError naming waypoints[i]. deferred-1.7 (also W3-T13-11)
W1-T12-05 engineering/pid/lines.py count_crossings undercounts a crossing that lands exactly on the other polyline's vertex. deferred-1.7 (reported metric; orthogonal auto routes cannot produce it)
W1-T12-06 engineering/pid/lines.py A format spec containing - ({seq:-05d}) is refused with a misleading message. accepted-limitation (a refusal, not a wrong number; hyphen inside a field spec is unsupported)
W1-T12-07 engineering/pid/lines.py label_placement([(0,0)]) raises an unnamed error; a closed-loop waypoint route is accepted; {{seq}} is copied through. accepted-limitation (unreachable through the tools; cosmetic)

Wave 2

Track A Task 3 — block_define

ID File Finding Disposition
W2-T3-01 README.md Snapshot bumped while lines 23/30/106 still said 154. fixed-in-track-A (Task 21 README rewrite: "166 tools in 20 groups")
W2-T3-02 tests/test_tool_registry.py Frozen snapshot edited outside the file list. accepted-limitation (required by the gate; the precedent every later task follows)
W2-T3-03 backends/ezdxf_backend.py base_x/base_y only float()-cast; NaN written into the BLOCK record. fixed-in-task-4
W2-T3-04 backends/ezdxf_backend.py A primitive layer is written without a layer-table entry; COM would fail mid-loop. fixed-in-task-4
W2-T3-05 README.md Same as W2-T3-01. fixed-in-track-A
W2-T3-06 backends/ezdxf_backend.py ATTDEF linetype stays BYLAYER on ezdxf vs ByBlock on COM; neither sets lineweight ByBlock. deferred-1.7 (cosmetic; layer-0 members resolve to the INSERT's layer)
W2-T3-07 backends/ezdxf_backend.py attdefs or [] turns {}/'' into "no ATTDEFs"; a non-str name raises AttributeError. deferred-1.7
W2-T3-08 backends/ezdxf_backend.py block_insert without attributes carries none of the ATTDEF defaults (COM does). deferred-1.7 (with W1-T1-08)

Track A Task 4 — XDATA

ID File Finding Disposition
W2-T4-01 discovery/aliases.py entity_get_xdata ships XDLIST only (XDATA would break the single-route gate). accepted-limitation (still discoverable; reporting gap)
W2-T4-02 tests/test_tool_registry.py Snapshot edited outside the file list. accepted-limitation (gate precedent)
W2-T4-03 backends/ezdxf_backend.py APPID names are case-sensitive headlessly; APP_A and app_a become two groups and double-count the budget. deferred-1.7
W2-T4-04 backends/com_backend.py A no-op removal registers the APPID on COM but not on ezdxf. deferred-1.7
W2-T4-05 backends/xdata_specs.py 1004 binary chunks decode to the repr of a bytes object. deferred-1.7 (hex string)
W2-T4-06 backends/xdata_specs.py The reserved-app rule blocks reading ACAD by name while the unfiltered read returns it; other AutoCAD-owned apps are writable. deferred-1.7
W2-T4-07 README.md Snapshot paragraph contradicted itself; collected-tests drift. fixed-in-track-A (Task 21)

Track A Task 5 — engineering/pid/xdata.py

ID File Finding Disposition
W2-T5-01 engineering/pid/__init__.py Listed as "create" but already existed. accepted-limitation (nothing missing)
W2-T5-02 tests/test_pid_xdata.py Sync tests under a module-level pytest.mark.asyncio emit PytestWarnings. deferred-1.7 (hygiene sweep across the pid test modules)
W2-T5-03 spec Spec payload (actuator, 3-element ports, no seq) vs plan (variant, 5-element ports, seq). accepted-limitation (plan governs; spec text to reconcile)
W2-T5-04 engineering/pid/xdata.py encode_payload uses allow_nan=True; a NaN would be serialised as a non-RFC literal. deferred-1.7 (allow_nan=False; no current caller can deliver one after Task 5)
W2-T5-05 engineering/pid/xdata.py symbol_payload(params={}) is replaced by the spec's params (truthiness). deferred-1.7
W2-T5-06 engineering/pid/xdata.py Duplicate port names collapse silently (last wins). deferred-1.7 (refuse in make_spec)
W2-T5-07 engineering/pid/xdata.py A non-dict payload is written and can never be read back. deferred-1.7
W2-T5-08 tests/test_pid_xdata.py No multi-chunk payload round trip through a backend. deferred-1.7 (test gap; the path was verified by hand)

Track A Task 7 — symbol framework

ID File Finding Disposition
W2-T7-01 engineering/pid/symbols.py Per-type outlines (no circle for computer/plc) deviate from the plan snippet, unreported. accepted-limitation (the spec's ISA table governs; tests added)
W2-T7-02 tests/test_pid_symbols.py Unused import dropped, math added. accepted-limitation (no functional effect)
W2-T7-03 engineering/pid/symbols.py Rear-location dashed lines stop up to 1 mm short on the right. accepted-limitation (cosmetic; no port, bbox or gate depends on it)
W2-T7-04 engineering/pid/symbols.py A single radial signal port cannot describe the hexagon/square outlines (0.67 mm gap on vertical lines into computer). accepted-limitation (spec §4.4 model; a per-axis reach is a 1.7 item)
W2-T7-05 engineering/pid/symbols.py all_specs() swallows builder ValueErrors and nothing pins the catalogue size. deferred-1.7 (assert len(all_specs()))
W2-T7-06 engineering/pid/symbols.py register() overwrites silently; list_symbols() returns variants by reference. deferred-1.7
W2-T7-07 engineering/pid/geometry.py bbox_of samples arcs at 1° and can under-report by 3.8e-5·r. accepted-limitation (sub-lineweight)

Track A Task 8 — valves

ID File Finding Disposition
W2-T8-01 plan The plan file was edited to match the shipped geometry, unreported. accepted-limitation (the original geometry floated the dome; evidence in the commit)
W2-T8-02 engineering/pid/symbols_valves.py check/relief advertise actuator variants they refuse. deferred-1.7 (variants ["none"] for those bodies)
W2-T8-03 engineering/pid/symbols_valves.py The diaphragm body dome floats 1 mm above the bow-tie. deferred-1.7 (cosmetic)
W2-T8-04 engineering/pid/symbols_valves.py The signal port and the TAG/DESC text share x = 0 above the actuator; a signal line crosses the tag. accepted-limitation (spec §4.7 placement; a tag/line overlap critique is a 1.7 item, with W2-T9-05)

Track A Task 9 — equipment

ID File Finding Disposition
W2-T9-01 engineering/pid/symbols_equipment.py pd_pump ports are in/out, spec says suction/discharge. accepted-limitation (plan governs; spec text to reconcile; pid_from_spec names ports explicitly)
W2-T9-02 engineering/pid/symbols_equipment.py spectacle_blind cites ISO 10628-2 instead of PIP PIC001; no spec names its figure/table. deferred-1.7 (provenance strings)
W2-T9-03 engineering/pid/symbols_equipment.py Same as W2-T9-01. accepted-limitation
W2-T9-04 engineering/pid/symbols_equipment.py build_equipment ignores shape for non-reducers and its signature is narrower than **options. accepted-limitation (resolve() validates options; builders are internal)
W2-T9-05 engineering/pid/symbols_equipment.py TAG/DESC sit on the outward ray of every +Y port. accepted-limitation (with W2-T8-04)
W2-T9-06 engineering/pid/symbols_equipment.py air_cooler fan cross pokes 0.046 mm outside its circle. deferred-1.7 (cosmetic, ±1.75)
W2-T9-07 engineering/pid/symbols_equipment.py Seven origins are not the bbox centre (spec §4.2). accepted-limitation (deliberate mounting points; spec text to reconcile)

Track A Task 10 — vessels

ID File Finding Disposition
W2-T10-01 engineering/pid/geometry.py scan_hits added outside the file list, unreported. accepted-limitation (additive, tested)
W2-T10-02 engineering/pid/symbols_vessels.py Stricter size rules and outline-based stubs, unreported. accepted-limitation (evidence in the commit; plan tests unchanged)
W2-T10-03 spec PID_VESSEL_VERTICAL_ vs PID_VESSEL_VERTICAL_VESSEL_. accepted-limitation (plan's general rule governs)
W2-T10-04 engineering/pid/symbols_vessels.py Non-finite sizes/fractions pass validate_vessel_params (NaN spec, RuntimeError for inf). deferred-1.7 (math.isfinite next to > 0)
W2-T10-05 engineering/pid/symbols_vessels.py Column tray lines poke through dished heads (up to 1.8 mm). deferred-1.7 (clip to the outline with scan_hits)
W2-T10-06 engineering/pid/symbols_vessels.py Nozzle fractions near 0/1 on curved/sloped sides give degenerate long stubs from a corner. deferred-1.7
W2-T10-07 engineering/pid/symbols_vessels.py trays is unbounded (1 000 000 trays build in 6.3 s / 272 MB). deferred-1.7 (cap by spacing ≥ 1 mm)
W2-T10-08 engineering/pid/symbols_vessels.py Two nozzles at the same side+fraction duplicate the stub; -0.0 hashes to a different block name. deferred-1.7

Waves 3–4

Track A Task 11 — pid_symbol_list / pid_symbol_insert

ID File Finding Disposition
W3-T11-01 engineering/layers.py PROCESS-LINE-TEXT inserted at position 9; spec said "16th entry". accepted-limitation (count matches; ordinal wording only)

Track A Task 13 — pid_line_draw

ID File Finding Disposition
W3-T13-01 tests/test_tool_registry.py Snapshot edited outside the file list. accepted-limitation (gate precedent)
W3-T13-02 discovery/aliases.py PLINE added to SHARED_ACAD_COMMANDS. accepted-limitation (required by the single-route gate; documented in the allowlist comment)
W3-T13-03 backends/com_backend.py e924b5d touched three files outside the list, unreported (COM AcDbPolyline naming, mirrored ports). accepted-limitation (both were defects; tests added)
W3-T13-04 server.py >= for ≥ in a docstring. accepted-limitation (cosmetic)
W3-T13-05 engineering/pid/drawlines.py Line sequence is per current space, not per document (spec §6.3). deferred-1.7 (document-wide scan of existing lines)
W3-T13-06 engineering/pid/drawlines.py Every signal line got a fabricated number and label and consumed the process sequence. fixed-in-task-6
W3-T13-07 engineering/pid/drawlines.py A bubble's exit aimed at the far end even with waypoints, so the first segment cut through the bubble. fixed-in-task-6
W3-T13-08 engineering/pid/drawlines.py A foreign/hand-edited payload with a non-dict from/to raised TypeError out of draw_line. fixed-in-task-7
W3-T13-09 engineering/pid/drawlines.py (a) crossings tested against chords, not arcs; (b) COM heavy 2DPOLYLINE Coordinates read with stride 2. (a) fixed-in-task-7; (b) deferred-1.7 (heavy polylines the tool never creates)
W3-T13-10 README.md Snapshot line edited without the collected-tests figure. fixed-in-track-A (Task 21)
W3-T13-11 server.py An unknown endpoint handle and a flat waypoint list surface as "Internal error" rather than a named refusal. deferred-1.7 (with W1-T12-04)

Track A Task 14 — pid_graph

ID File Finding Disposition
W3-T14-01 engineering/pid/graph.py Block-name keywords match whole tokens, not substrings (spec §9.2); GATEVALVE no longer classifies. accepted-limitation (the plan's own test demands it; documented in code)
W3-T14-02 backends/ezdxf_backend.py A public bulges key was added to every LWPOLYLINE entity_get, unreported. accepted-limitation (additive; spec §9.4 "geometry from the drawing"; now consumed by Task 7)
W3-T14-03 tests/test_tool_registry.py Snapshot edited outside the file list. accepted-limitation (gate precedent)
W3-T14-04 engineering/pid/graph.py Edge dict carries length_approximate and (with geometry) bulges beyond the spec. accepted-limitation (additive)
W3-T14-05 tests/test_pid_graph.py Three sync tests under the asyncio mark warn. deferred-1.7 (hygiene, with W2-T5-02)
W3-T14-06 engineering/pid/graph.py _Edge.segments omits a closed polyline's closing edge while length includes it. deferred-1.7
W3-T14-07 engineering/pid/graph.py The dangling nearest hint never names a radial (bubble) port. deferred-1.7
W3-T14-08 engineering/pid/graph.py Text-tag fallback searched a circle, not "above the box". fixed-in-track-A (d17a261, 6ad3734: tags above the box, LINE_NUMBER_RE excluded)
W3-T14-09 engineering/pid/graph.py scope="all" restores current but not the paper-space layout binding. deferred-1.7
W3-T14-10 engineering/pid/graph.py A −Z-extruded catalogue INSERT reported mirror-image ports at confidence 1.0. fixed-in-track-A (6ad3734: both engines report mirrored; transform_port(mirrored=))
W3-T14-11 engineering/pid/graph.py A PID_* INSERT whose XDATA was stripped falls to the 0.6 heuristic with no ports (spec says catalogue 1.0). deferred-1.7
W3-T14-12 README.md Release-consistency gate red on the collected-tests figure. fixed-in-track-A (Task 21)
W3-T14-13 engineering/pid/symbols.py 6ad3734 touched five files outside the list; transform_port grew mirrored/strict. accepted-limitation (justified; interface kept by keyword defaults)
W3-T14-14 engineering/pid/graph.py _text_near accepts a baseline half a height inside the box and excludes line-number texts — beyond the spec wording. accepted-limitation (documented, tested)
W3-T14-15 engineering/pid/graph.py Node dicts gained y_scale, mirrored, notes, space, description; junctions space. accepted-limitation (additive)
W3-T14-16 docs (plan/spec) ruff format --check was red on the plan and spec Markdown. fixed-in-track-A (Task 21 formatted them)
W3-T14-17 spec §9.1 model not extended for the added node/junction keys. deferred-1.7 (docs)
W3-T14-18 engineering/pid/symbols.py strict=False keeps a diagonal port's local angle under non-uniform scale. accepted-limitation (unreachable: all 243 catalogue ports are axis-aligned)
W3-T14-19 backends/ezdxf_backend.py mirrored is True for a tilted INSERT with a negative-z normal (COM twin too). deferred-1.7 (flat and z < 0)

Track A Task 15 — deliverables

ID File Finding Disposition
W3-T15-01 tests/test_pid_deliverables.py Four plan deviations (line-list rows, _far_ends, CSV refusal, deliverable() ValueError) unreported. accepted-limitation (each stronger than the plan; the plan's own numbers were wrong)
W3-T15-02 tests/test_tool_registry.py Snapshot edited outside the file list. accepted-limitation (gate precedent)
W3-T15-03 tests/_probe_task15.py A stray probe file appeared during review. fixed-in-track-A (not in the tree)
W3-T15-04 engineering/pid/deliverables.py natural_key crashes on str.isdigit() runs that are not \d (①, ²). deferred-1.7 (isdecimal)
W3-T15-05 engineering/pid/deliverables.py _far_ends resolves junctions at the ends of the instrument's line only, not on it. deferred-1.7
W3-T15-06 engineering/pid/deliverables.py _tag_of writes the internal junction id into a tag column; untagged node ends are None vs handle in the index. deferred-1.7
W3-T15-07 engineering/pid/deliverables.py write_csv edge cases: 0-byte file for zero rows, csv_path='' treated as None, directory path escapes as PermissionError, dead mkdir, late validation. deferred-1.7
W3-T15-08 engineering/pid/deliverables.py CSV formula injection: cells starting with =+-@ are written verbatim. deferred-1.7 (first item of the 1.7 deliverables pass)
W3-T15-09 server.py The three deliverable tools expose only tolerance/scope, not label_search/include_foreign. deferred-1.7
W3-T15-10 engineering/pid/deliverables.py signal_lines counts every edge on a bubble regardless of class. deferred-1.7

Track A Task 16 — critique focuses

ID File Finding Disposition
W3-T16-01 tests/test_pid_critique.py The refine test calls refine_drawing (no backend drawing_refine exists), unreported. accepted-limitation (the plan's call could not run; stricter test)
W3-T16-02 engineering/pid/critique.py has_pid_content guard instead of not graph['nodes'], unreported. accepted-limitation (spec intent; pinned by tests)
W3-T16-03 engineering/pid/critique.py _incompatible skips inferred ports; _dangling reports unknown_block ends — beyond the plan. accepted-limitation (spec §9.4 / §11.1; tested)
W3-T16-04 tests/test_pid_critique.py Two sync tests warn under the asyncio mark. deferred-1.7 (hygiene)
W3-T16-05 engineering/pid/critique.py _untagged tests the composed tag, not FUNC/LOOP; an empty LOOP files as pid_illegal_tag. deferred-1.7
W3-T16-06 engineering/pid/critique.py A mechanical block whose name holds a keyword token (OIL_FILTER) counts as P&ID content and can fail finalize. accepted-limitation (spec §9.2 mandates the heuristic; README "Known limitations" states it)
W3-T16-07 engineering/pid/critique.py _duplicate_tags scores a text-derived (guessed) tag as a gate-failing error. deferred-1.7 (warning for tag_source: text)

Track A Task 17 — pid_from_spec

ID File Finding Disposition
W4-T17-01 tests/test_pid_from_spec.py Four reported deviations verified legitimate (save_path, score dict, async test, snapshot). accepted-limitation
W4-T17-02 engineering/pid/spec.py The module is a refactor of the plan's listing; interfaces preserved. accepted-limitation
W4-T17-03 README.md pid-showcase.png rendered but not referenced. fixed-in-track-A (README line 20 embeds it)
W4-T17-04 tests/test_release_consistency.py Collected-tests drift. fixed-in-track-A (Task 21)
W4-T17-05 engineering/pid/spec.py _num accepts NaN/inf; an INSERT lands at [nan, 0] and build_graph crashes. fixed-in-task-5
W4-T17-06 engineering/pid/spec.py run_spec catches Exception only; a cancellation leaves an open transaction. fixed-in-task-5
W4-T17-07 engineering/pid/spec.py dry_run skips place_symbol's option checks (scale=-1 approved; wrong item blamed). deferred-1.7 (validate_spec owns scale/fail/actuator rules)
W4-T17-08 engineering/pid/spec.py dry_run crossings count the spec's own lines only, unlabelled. deferred-1.7 (crossings_scope field)
W4-T17-09 engineering/pid/spec.py Nested transactions: ezdxf nests, COM refuses; drawing_plan is set before the refusal. deferred-1.7
W4-T17-10 engineering/pid/spec.py The sheet block is not validated (unknown layer set / sheet size / keys accepted). deferred-1.7
W4-T17-11 engineering/pid/spec.py String-typed optional keys unvalidated (arrow: "no" truthy; number: 123 bare TypeError; id with a dot). deferred-1.7
W4-T17-12 README.md README showcase half incomplete; gate red. fixed-in-track-A (Task 21)

Track A Task 19 — tag parse, resources, prompt

ID File Finding Disposition
W4-T19-01 tests/test_tool_registry.py Snapshot edited outside the file list. accepted-limitation (gate precedent)
W4-T19-02 scripts/render_pid_catalog.py Renders through its own matplotlib path instead of view_screenshot, unreported. accepted-limitation (byte-reproducible output; interface kept)
W4-T19-03 README.md Lines 23/106 still said 154 / 6 resources. fixed-in-track-A (Task 21)
W4-T19-04 server.py The prompt's OFF-PAGE example emits a tag warning every time it is followed (TO P&ID-002 parsed as ISA-5.1). deferred-1.7 (skip parse_tag for connectors at insert)
W4-T19-05 engineering/pid/tags.py equipment_prefixes={} discarded; non-string values pass. deferred-1.7 (with W1-T6-05)
W4-T19-06 README.md Release gate red on the collected-tests figure. fixed-in-track-A (Task 21)

Track A Task 18 — TOOL_PACKS

ID File Finding Disposition
W4-T18-01 tests/test_tool_packs.py A sync test warns under the asyncio mark. deferred-1.7 (hygiene)
W4-T18-02 README.md / config.py / .env.example Token table and prose said 47 while lean has 50. README: fixed-in-track-A (Task 21); config.py:99 / .env.example:52 "~47": deferred-1.7 (docs)
W4-T18-03 server.py TOOL_PACKS=all,mech3000 drops the unknown entry without a warning or ignored. deferred-1.7
W4-T18-04 server.py _enabled_packs() runs twice per apply; unknown entries warn twice and duplicate in ignored. deferred-1.7
W4-T18-05 tests/test_tool_packs.py The pack test compares against a hand-copied set, never the registry. deferred-1.7 (assert against _registered_tools() tags)
W4-T18-06 server.py Under TOOL_PACKS=core the P&ID prompt and resources are still advertised. accepted-limitation (spec §12 scopes packs to tools)

Track A Task 20 — benchmark v4

ID File Finding Disposition
W4-T20-01 scripts/check_doc_numbers.py The gate short-circuited on the 29-vs-26 A/B drift. fixed-in-track-A (Task 21 regenerated the A/B report)
W4-T20-02 CLAUDE.md An extra clause beyond the dictated sentence. accepted-limitation (accurate)
W4-T20-03 benchmarks/README.md "16/16 on the v4 matrix" has no published artifact behind it. deferred-1.7 (publish a v4 reference report at the 1.6 release)
W4-T20-04 tests/test_benchmark_v4.py No test executes _task_pid_roundtrip. deferred-1.7 (Task 6 of the hardening plan runs it by hand)
W4-T20-05 benchmarks/README.md A/B rows said 29 checks over a 26-check report. fixed-in-track-A (Task 21)

Track A Task 21 — docs and smoke

ID File Finding Disposition
W4-T21-01 scripts/smoke_pid_com.py Not re-run live during review (no AutoCAD running). accepted-limitation (the implementer's live run is recorded in the CHANGELOG)
W4-T21-02 README.md "Known limitations of the P&ID track" was not a plan item. accepted-limitation (claims verified against the code)
W4-T21-03 docs (plan) The plan file was ruff-formatted outside the file list. accepted-limitation (mechanical)
W4-T21-04 benchmarks/README.md Tables moved for the new gate labels. accepted-limitation (required by check_doc_numbers.py)
W4-T21-05 CHANGELOG.md "12.5 % short on a semicircular jump" is the v1.5 square figure; the tested geometry is 10.25 %. deferred to the final docs task of Track E (CHANGELOG Unreleased edit)
W4-T21-06 README.md The snapshot is labelled v1.5 while quoting the 1.6-dev surface. accepted-limitation (pinned to pyproject's minor until the 1.6 bump)
W4-T21-07 scripts/smoke_pid_com.py Exit code checks dangling only; critique/confidence/xdata are printed, not asserted. deferred-1.7
W4-T21-08 CHANGELOG.md LAYER_SET_INTENT_MISMATCH is claimed for drawing_plan, which only appends a warning string. deferred to the final docs task of Track E

Totals

165 rows. Fixed in this track (Tasks 1–7): 15 · fixed inside Track A: 17 · accepted with a reason: 62 · deferred (1.7 or the Track E docs task): 71.