Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,40 @@ once the public API stabilizes at 0.1.0.

## [Unreleased]

### Added — the table objects decode: TABLESTYLE from R2010, CELLSTYLEMAP, TABLEGEOMETRY, TABLECONTENT and ACAD_TABLE (2026-10-27 and 28, #313, #316, #317, #319, #151)

TABLESTYLE (§20.4.101.2) and CELLSTYLEMAP (§20.4.102) share one cell-style reader (§20.4.101.3 and §20.4.101.4). TABLEGEOMETRY (§20.4.103), TABLECONTENT (§20.4.97) and the ACAD_TABLE entity (§20.4.96) follow, each paired with AutoCAD's DXF export by its probe. 103 skipped records of the pinned corpus now decode. An ACAD_TABLE's insertion rotation is compared in degrees against group 50; no pinned table is rotated, so that comparison is not yet measured on a nonzero angle.

### Added — nineteen classes the spec does not print decode from AutoCAD's own DWG and DXF output (2026-10-28, #326 to #341, #152)

Derived under the `CLEANROOM.md` method of 2026-10-26, on every release from R14 to R2018:
- WIPEOUTVARIABLES, ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION, ACDB_BLOCKREPRESENTATION_DATA, PDFDEFINITION and DBCOLOR (#326).
- The dynamic-block evaluation objects BLOCKGRIPLOCATIONCOMPONENT, BLOCKLINEARGRIP, BLOCKVISIBILITYGRIP, BLOCKLINEARPARAMETER, BLOCKVISIBILITYPARAMETER and BLOCKSCALEACTION (#328).
- DIMASSOC (#329).
- ACSH_HISTORY_CLASS and ACSH_BOX_CLASS (#330), and ACSH_EXTRUSION_CLASS (#341).
- SUN (#332).
- DATATABLE (#335). Its column and cell lists start at no more than 1,024 entries and grow as entries decode, so a malformed count cannot reserve memory (#185).
- ACDB_TEXTOBJECTCONTEXTDATA_CLASS (#337).
- ACAD_EVALUATION_GRAPH (#339).

PDFUNDERLAY now decodes on every release and is checked against AutoCAD's DXF (#331). With the table objects above, the corpus job's skipped records fell from 379 to 44, with none errored.

### Added — the value oracle scores the DIMENSION family (2026-10-28, #387)

§20.4.22 to §20.4.29, each dimension type's groups scored against AutoCAD's DXF export by handle.

### Added — the canonical fixtures carry BLOCK_HEADER and BLOCK pairs (2026-10-28, #407, closes #78)

`build_fixtures` writes a block header and its block for each synthetic drawing, so the block-name gate runs in CI on every release the writer covers.

### Added — maintainer tools: a Jev review of stale prose and issues, and the AutoCAD trial session (2026-10-28, #406, #383)

`tools/maintainer/jev_review.py` ranks the README, STATUS and ROADMAP statements, and the open issues, that a merged pull request may have overtaken (housekeeping item 10 in `docs/maintaining.md`). `tools/autocad/` writes the scripts, staged inputs and manifest for an AutoCAD session that re-saves the pinned R13 drawings and builds controlled drawings, and checks what the session produced.

### Changed — the merge train lands stacked pull requests on its own (2026-10-28, #421, #422, #423)

A PR stacked on one that has landed merges main against the newest commit of that PR it holds. Sections main renumbered are followed in its own lines. A PR that holds commits of an older open PR waits until that PR lands. A Codex thread that asks to commit the measured baseline is settled once the Corpus job passes.

### Changed — the merge train builds and tests nothing locally (2026-10-27, #408)

Every build, test and corpus measurement is a GitHub Actions run on the pull request. The train merges main in and pushes, then commits the corpus and oracle baselines and README coverage that the PR's own CI run measured, refusing anything worse than main. A PR stacked on another waits until GitHub retargets it to main.
Expand Down
21 changes: 15 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,17 @@ object-data size on R2000 to R2007, the size inside the common entity data
on R13/R14), or it returns an error instead of plausible-looking geometry.
An *errored* record is a field list that does not add up; there are none left
on the pinned corpus. A *skipped* record is a type with no decoder on `main`
yet. Every skipped type has a decoder in review: the open pull requests
labelled `type:feature` under the "every object prescription" epic (#138), which the
merge train lands one at a time, each landing moving the tables above. The
Corpus job's `corpus-measurement` artifact lists the skipped records of each
drawing by type (`corpus-logs/`).
yet. Two of the skipped types have a decoder in review, SHAPE (#310) and the
VIEWPORT entity header (#311). The rest are custom classes in the four
drawings pinned from kurema/BookViewerApp3: the render settings
(RAPIDRTRENDERENVIRONMENT, RAPIDRTRENDERSETTINGS, MENTALRAYRENDERSETTINGS and
RENDERGLOBAL), five associative-network classes (ACDBASSOCNETWORK,
ACDBASSOCACTION, ACDBASSOCDEPENDENCY, ACDBASSOCVERTEXACTIONPARAM and
ACDBASSOCARRAYACTIONBODY), ACSH_CYLINDER_CLASS, ACSH_REVOLVE_CLASS, and LIGHT
declared as a custom class. Those drawings have no DXF
export to derive or score them against yet (#152). The Corpus job's
`corpus-measurement` artifact lists the skipped records of each drawing by
type (`corpus-logs/`).

Most of the classes in that list are not printed in the spec at all; their
field lists are learned from AutoCAD's own DWG and DXF output under the
Expand Down Expand Up @@ -129,7 +135,7 @@ passed.
| Handle map and class map | Shipped | |
| Header variables | Shipped | Table-driven by release range (#126) |
| Object-stream walker | Shipped | Every release from R14 to R2018; every handle-map entry resolves to a record |
| Entity and object decoders | Alpha | 0 errored records on the pinned corpus; every skipped type has a decoder in review (above) |
| Entity and object decoders | Alpha | 0 errored records on the pinned corpus; the skipped types are listed above, two with a decoder in review |
| Symbol tables | Alpha | Every table record in the pinned corpus decodes, on every release; values scored by the DXF oracle |
| Entity graph (owners, reactors, blocks, layers) | Partial | Resolver APIs exist; reference closure is measured per drawing in CI |
| Streaming reader | Alpha | Byte-demand state machines up to the object records; see below |
Expand Down Expand Up @@ -205,6 +211,9 @@ every later disclosure.
short outside the ten proven pages still decodes as lossy UTF-8 (#375).
- Decode password-protected R2007 files: a section whose descriptor declares
encryption is refused, not decoded.
- Decode the render-settings classes, five associative-network classes and
ACSH_CYLINDER_CLASS and ACSH_REVOLVE_CLASS (listed above); the pinned corpus
holds a few such records and no DXF export of them yet (#152).
- Write R13, R14 or R2007 files; the writer covers the R2004 family only.
- Byte-identical DWG round trips, or output checked by any CAD application.
- Python bindings, a non-technical end-user application, an installer or a
Expand Down
4 changes: 3 additions & 1 deletion STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,9 @@ the current capability matrix.

## Pending — non-trivial work remaining

These have genuine open scope requiring focused work, not stubs.
These have genuine open scope requiring focused work, not stubs. Their counts
are the 2026-08-30 snapshot of the 19-file subset; the corpus table at the top
of this page is current, and README.md lists the types still skipped.

- **Current real-file decode baseline:** the 2026-08-30
`examples/coverage_report.rs ../../samples` run reports 2273 decoded,
Expand Down
Loading