This is the living roadmap for turning the current ASCII .PcbDoc prototype
into a dependable TypeScript toolkit for reading, inspecting, editing, and
writing Altium files.
- Checked items describe behavior already present in the initial prototype.
- Unchecked items are planned work, not claims about undocumented Altium internals.
- Binary layouts, stream names, record IDs, and version-specific behavior must be verified against real files before being treated as stable.
- Round-trip safety takes priority over semantic completeness: unknown data must be retained whenever possible.
- Define the officially supported Altium Designer versions.
- Define the oldest file versions that must remain readable.
- Define the newest file versions included in the fixture corpus.
- Publish a compatibility matrix by Altium version and file type.
- Distinguish read, write, edit, and exact-round-trip support in the matrix.
- Distinguish ASCII and binary variants of each format.
- Decide whether legacy Protel formats are in scope.
- Decide whether CircuitMaker and CircuitStudio variants are in scope.
- Decide whether Altium 365-specific metadata is in scope.
- Define the browser-runtime support target.
- Define the Node.js support target.
- Define the Bun support target.
- Define acceptable behavior for encrypted or password-protected documents.
- Define acceptable behavior for corrupted or partially recovered files.
- Define a deprecation policy for public APIs and parsed model fields.
- Define a policy for experimental parsers and codecs.
- Add capability flags so callers can query supported operations.
- Add a machine-readable compatibility manifest.
- Add format/version detection without requiring a filename extension.
- Publish a TypeScript-first package structure with
lib/andtests/. - Provide a common
AltiumNodebase class. - Provide generic
getChildren()tree walking. - Provide an
AltiumPcbDocroot class. - Provide
parseAltiumPcbDoc()for ASCII PCB documents. - Provide the generic
parseAltiumAscii()parser. - Provide deterministic
getString()serialization. - Preserve record order.
- Preserve field order.
- Preserve duplicate fields.
- Preserve unknown record kinds.
- Preserve malformed lines in permissive mode.
- Preserve CR, LF, CRLF, and mixed line endings.
- Provide strict and permissive ASCII parsing modes.
- Provide basic string, boolean, number, and measurement field accessors.
- Model common PCB record kinds as dedicated classes.
- Download a pinned, licensed real-world reference board.
- Round-trip the current reference board exactly.
- Run test, typecheck/build, and format/lint checks in CI.
- Build ESM JavaScript and TypeScript declarations.
- Add a stable package-level error hierarchy.
- Add source-location metadata to parsed text, binary, and container nodes.
- Add structured warnings without requiring thrown errors.
- Add immutable or copy-on-write APIs where useful.
- Add a visitor API in addition to
getChildren(). - Add a transformer API that can replace or remove nodes.
- Add parent/document references without creating serialization cycles.
- Add source-derived stable node IDs for editor and diff tooling.
- Inventory every Altium file extension we intend to support.
- Collect ASCII and binary
.PcbDocfiles from multiple independent projects. - Collect ASCII and binary
.SchDocfiles from multiple independent projects. - Collect
.PcbLibfiles from multiple Altium releases. - Collect
.SchLibfiles from multiple Altium releases. - Collect
.IntLibfiles with multiple embedded libraries. - Collect
.PrjPcband related project files. - Collect
.OutJobfiles. - Collect workspace/session files if they are in scope.
- Collect files using Unicode names, values, and paths.
- Collect files using every common unit system.
- Collect single-layer, two-layer, multilayer, flex, and rigid-flex boards.
- Collect boards with blind, buried, micro, and stacked vias.
- Collect boards with differential pairs and length tuning.
- Collect boards with polygons, split planes, rooms, and embedded boards.
- Collect boards with component bodies and linked 3D models.
- Collect hierarchical and multichannel schematics.
- Collect schematics with harnesses, buses, directives, and variants.
- Collect schematic and PCB libraries with large component counts.
- Collect files containing unknown/newer record and field types.
- Collect intentionally malformed and truncated files.
- Collect files with empty streams and zero-length records.
- Record the license and provenance of every downloadable fixture.
- Pin every external fixture to an immutable commit or content digest.
- Store fixture SHA-256 hashes and verify downloads.
- Avoid committing third-party fixtures unless their licenses permit it.
- Add synthetic fixture generators for cases that cannot be redistributed.
- Add minimal one-feature fixtures for each entity or encoding.
- Add a multi-megabyte real-world stress-test fixture.
- Add a 60 MB, 400,000-plus-record multilayer production-board fixture and exercise it in strict validation and SVG snapshot tests.
- Add an anonymization tool for private customer fixtures.
- Add a corpus inventory script that reports formats, versions, and record and stream counts.
- Add stream-family inventory for unknown binary content.
- Add a fixture minimizer for reducing parser failures.
- Document all external format references and reverse-engineering sources.
- Track unresolved format questions in issues linked from this checklist.
- Detect ASCII Altium record streams.
- Detect OLE/CFB compound binary documents by magic bytes.
- Detect ZIP-based containers where applicable.
- Detect INI-like project and job files.
- Detect XML-based Altium formats where applicable.
- Detect UTF-8 BOMs.
- Detect UTF-16 LE and UTF-16 BE BOMs.
- Fall back to Windows-1252 for non-UTF-8 text.
- Provide an explicit encoding override.
- Return the detected format, encoding, and confidence.
- Reject binary input passed to a text-only parser with a helpful error.
- Add
parseAltiumFile(Uint8Array, options)as the main auto-detect entrypoint. - Add
parseAltiumFileFromPath()as an optional Node/Bun convenience API. - Keep the core parser independent of filesystem APIs.
- Preserve an original-byte snapshot when exact untouched serialization is possible.
- Detect truncated compound-file headers before invoking deeper parsers.
- Impose configurable file-size limits before allocating large buffers.
- Create an
AltiumErrorbase class. - Create
AltiumSyntaxError. - Create
AltiumFormatDetectionError. - Create
AltiumUnsupportedVersionError. - Create
AltiumUnsupportedFeatureError. - Create
AltiumCorruptContainerError. - Create
AltiumTruncatedRecordError. - Create
AltiumSerializationError. - Add byte offsets to binary errors.
- Add line and column locations to text errors.
- Add stream paths and record indexes to container errors.
- Add record kind and field name context where available.
- Support warning, error, and fatal diagnostic severities.
- Support diagnostic codes suitable for programmatic handling.
- Provide a callback or collector for nonfatal diagnostics.
- Define strict, compatible, and recovery parsing modes.
- Make recovery decisions visible in diagnostics.
- Never silently drop bytes or fields during recovery.
- Add readable error excerpts with bounded context.
- Redact potentially sensitive field values from diagnostics on request.
- Separate syntax-level nodes from semantic convenience models.
- Define a stable discriminated union for every public node type.
- Define a base document interface shared by all root documents.
- Define a base record interface shared by text and binary records.
- Define a raw/unknown node for every parse layer.
- Preserve original raw bytes on unknown binary nodes.
- Preserve original raw text on unknown text nodes.
- Track dirty state at field, record, stream, and document levels.
- Reuse untouched raw source when a node has not changed.
- Define deterministic ordering for newly authored records and fields.
- Preserve original ordering for parsed records and fields.
- Define how duplicate keys are queried and mutated.
- Add first, last, and all-occurrence field accessors.
- Add insertion APIs that specify position relative to other fields.
- Add mutation APIs for replacing one duplicate occurrence.
- Add cloning APIs.
- Add deep equality APIs.
- Add structural hashing for nodes.
- Add typed references between records where indexes/IDs are used.
- Add a document-level repository for resolving indexes and unique IDs.
- Make dangling references representable.
- Preserve unresolved references during serialization.
- Add lazy decoding for large streams and payloads.
- Add lazy loading for embedded images and 3D model blobs.
- Lazily materialize compound-file stream contents on first access.
- Add a stable JSON representation for debugging and interchange.
- Add JSON import only after round-trip semantics are defined.
- Add type guards for every public node subclass.
- Add exhaustive visitors for compile-time coverage.
- Add generic search helpers by record kind, field, layer, and owner.
- Split records while preserving their original terminators.
- Parse ordered
KEY=VALUEfields. - Preserve empty and malformed field segments.
- Preserve unknown record kinds.
- Support BOM-prefixed files.
- Verify whether literal pipe characters can occur in field values.
- Implement every verified escape convention.
- Decode
%UTF8%field variants in binary property records. - Handle triple-pipe UTF-8 terminators where applicable.
- Preserve key casing.
- Define optional case-insensitive and decoded lookup helpers.
- Preserve whitespace around keys and values when encountered.
- Distinguish absent values from empty values.
- Distinguish raw numeric text from normalized numeric values.
- Preserve exponent spelling and precision.
- Preserve boolean spelling (
T/F,TRUE/FALSE, and variants). - Preserve unit spelling and casing.
- Parse embedded backtick-delimited configuration payloads.
- Parse nested serialized hashes only behind an explicit codec.
- Preserve unparsed nested configuration payloads exactly.
- Support records longer than the current real-world examples.
- Add configurable maximum line and field counts.
- Add streaming/incremental ASCII parsing.
- Add an async iterable parser for large text files.
- Add a streaming serializer.
- Add fuzz tests for delimiters, empty segments, and malformed fields.
- Add
AltiumBoardRecord. - Model file kind, format version, date, and time.
- Model board origin and sheet settings.
- Model display units.
- Model board grid settings.
- Model layer stack records.
- Model layer sub-stack and layer-pair metadata.
- Verify true rigid-flex sub-stack behavior against a fixture with a flex stack region.
- Model dielectric properties.
- Model copper thickness and material metadata.
- Model V9 controlled-impedance profiles and per-layer/sub-stack calculations.
- Model board-level view configurations.
- Model 2D and 3D configuration payloads.
- Model board-level unique IDs.
- Model board outline vertices and arcs.
- Model board cutouts.
- Verify physical board cutouts against a non-degenerate real fixture.
- Reconcile ASCII files whose physical contour is represented by connected
POLYGONOUTLINEkeepout primitives instead of the largerBoardcontour. - Model embedded board settings.
- Preserve application-specific configuration fields that are not semantic PCB data.
- Add
AltiumNetRecord. - Model net IDs/indexes and names.
- Model net classes.
- Model differential-pair definitions.
- Model from-to connectivity records.
- Model connection/ratsnest records.
- Resolve primitive net indexes to
AltiumNetRecordreferences. - Resolve component ownership indexes.
- Resolve polygon and rule indexes.
- Preserve dangling or invalid indexes.
- Add connectivity graph construction.
- Add helpers for querying connected primitives.
- Add
AltiumComponentRecord. - Model designators, comments, footprints, and library references.
- Model component position, rotation, and side.
- Model component locking and selection flags.
- Model component channels and source schematic identifiers.
- Model component parameters.
- Model component variants and fitted/not-fitted state.
- Model component rooms and classes.
- Model union/group membership.
- Model component body ownership.
- Resolve owned pads, text, tracks, arcs, fills, and regions.
- Add ergonomic component-bounds helpers.
- Add
AltiumPadRecord. - Model pad names/numbers and ownership.
- Model through-hole and SMD behavior.
- Model connector and test-point behavior from fixture-verified fields.
- Model simple and top/middle/bottom pad-stack shapes.
- Verify full-stack pad geometry against a real
PADMODE=2fixture. - Model round, rectangle, rounded-rectangle, and octagonal shapes.
- Model custom and region-based shapes.
- Render asymmetric round pads as rotated obround/stadium shapes.
- Model X/Y size by layer.
- Model hole size and round, square, and slot shapes.
- Model slot length and rotation.
- Model plated and non-plated holes.
- Model paste and solder-mask expansions.
- Model thermal relief settings.
- Model local stack/mode flags.
- Model pad-level net and pin references.
- Model pad tenting flags.
- Model pad test-point flags from a real test-point fixture.
- Preserve unsupported per-layer pad stack fields.
- Add
AltiumViaRecord. - Model via position, diameter, and hole size.
- Model start and end layers.
- Model through and blind/buried via types.
- Model via templates and local overrides.
- Model via tenting.
- Model via solder-mask expansion from a real via-mask fixture.
- Model thermal relief settings.
- Model via net references.
- Model via stitching and shielding metadata.
- Preserve unsupported via-stack fields.
- Add
AltiumTrackRecord. - Add
AltiumArcRecord. - Model start/end points.
- Model width and layer.
- Model center, radius, start angle, and end angle for arcs.
- Model net and component ownership.
- Model keepout and polygon-outline flags.
- Model user-routed state.
- Model track union membership and unique IDs.
- Model arc union membership and unique IDs from fixture-verified fields.
- Add exact geometry helpers without changing serialized precision.
- Handle zero-length tracks and full-circle arcs.
- Add
AltiumFillRecord. - Add
AltiumRegionRecord. - Add
AltiumPolygonRecord. - Model fill bounds and rotation.
- Model region contours and holes.
- Model region kind and layer.
- Model polygon vertices, arcs, and contour holes.
- Model polygon pour order and priority.
- Model polygon connect style and thermal settings.
- Model shelved, unpoured, and poured polygon states.
- Model polygon cutouts.
- Model split-plane regions.
- Distinguish source regions from generated region-fill primitives.
- Preserve generated-pour caches without treating them as authoritative.
- Add polygon geometry validation.
- Add
AltiumTextRecord. - Model text content and special strings.
- Model font selection, stroke width, and text height.
- Model justification, mirroring, rotation, and inversion.
- Model barcode and TrueType text options where present.
- Model component designator/comment semantics.
- Add
AltiumDimensionRecord. - Model linear, radial, angular, ordinate, baseline, and center dimensions.
- Model dimension units, precision, prefixes, and suffixes.
- Add
AltiumCoordinateRecord. - Preserve unsupported text rendering metadata.
- Add
AltiumComponentBodyRecord. - Add
AltiumModelRecord. - Model 3D body type, position, rotation, standoff, and opacity.
- Model extruded body outlines.
- Model embedded STEP model references from component bodies.
- Resolve linked external STEP model references.
- Model generic 3D model metadata.
- Extract and decompress embedded model blobs on demand.
- Reinsert untouched embedded model blobs byte-for-byte.
- Add
AltiumRoomRecord. - Model room boundaries and rule references.
- Add embedded-board records.
- Resolve embedded-board transforms and source paths.
- Add
AltiumRuleRecord. - Add
AltiumDxpRuleRecord. - Model rule name, priority, scope expressions, and enabled state.
- Model clearance rules.
- Model width rules, including per-layer constraints.
- Model via-style rules.
- Model routing-layer rules.
- Model differential-pair rules.
- Model matched-length rules.
- Model absolute length rules from a real fixture.
- Model impedance rules.
- Model plane and polygon-connect rules.
- Model solder-mask and paste-mask rules.
- Model manufacturing height, hole-size, silk, mask-sliver, and testpoint rule fields.
- Model remaining manufacturing and assembly rule kinds from verified fixtures.
- Preserve unknown rule kinds and opaque scope expressions.
- Add
AltiumClassRecord. - Model net, component, layer, pad, and rule classes.
- Add
AltiumParameterRecord. - Model option/configuration record families.
- Treat printer, Gerber, DRC, ECO, and placer options as typed records where useful.
- Preserve tool UI state separately from design semantics.
- Inventory all record kinds found across the reference corpus.
- Register every verified PCB primitive record kind.
- Add a test fixture for every registered record class.
- Document unsupported fields on partially modeled record kinds.
- Fail typed access predictably when required fields are absent.
- Continue preserving unregistered record kinds as
AltiumUnknownRecord.
- Create an
AltiumMeasurementvalue class. - Preserve raw measurement text alongside normalized values.
- Support mil, inch, mm, cm, and verified internal coordinate units.
- Verify unit conversion constants against exported Altium files.
- Avoid floating-point drift in parse/serialize cycles.
- Consider fixed-point integers or decimal arithmetic for coordinates.
- Model coordinates, points, vectors, sizes, and bounding boxes.
- Model rotations and angle normalization without rewriting untouched text.
- Model colors from Altium integer color values.
- Add initial layer-name and layer-ID normalization.
- Preserve unknown layer IDs with a stable fallback name.
- Add geometry helpers for arcs, polygons, and regions.
- Add contour winding helpers.
- Add geometry bounds for every currently rendered primitive.
- Add transforms for component-owned primitives.
- Add board-coordinate and component-local-coordinate conversions.
- Add layer-stack region geometry.
- Verify rigid-flex stack-region geometry against a true flex fixture.
- Add tolerance-aware comparisons for tests only.
- Implement a bounded, dependency-free Compound File Binary reader.
- Evaluate browser compatibility of the chosen CFB implementation.
- Audit the dependency's license and security posture.
- Parse the CFB header and sector sizes.
- Parse DIFAT, FAT, MiniFAT, and directory sectors.
- Parse regular and mini streams.
- Preserve directory entry names exactly.
- Preserve directory hierarchy.
- Preserve stream ordering where observable.
- Preserve CLSIDs, state bits, timestamps, and stream metadata.
- Preserve empty storages and streams.
- Detect FAT loops and invalid sector references.
- Enforce bounds while following sector chains.
- Add limits for chain length, directory entries, and total file size.
- Expose storages and streams as typed
AltiumNodeclasses. - Provide lazy stream content access.
- Support replacing one stream without decoding unrelated streams.
- Return the original bytes when the container is untouched.
- Serialize modified CFB containers deterministically.
- Test output by reopening it with both altiumts and an independent CFB implementation.
- Compare rewritten files in Altium Designer when access is available.
- Add corruption and adversarial-container fixtures.
- Document which CFB metadata cannot be reproduced exactly.
- Implement bounded little-endian byte readers.
- Implement bounded byte writers.
- Implement the bounded signed/unsigned integer and floating-point reads required by the first PCB primitive codecs.
- Implement fixed-point internal-coordinate decoding for tracks, arcs, and vias.
- Implement Pascal/length-prefixed string codecs.
- Implement UTF-8, UTF-16, and Windows-1252 decoding where verified.
- Implement null-terminated property payload handling where verified.
- Implement GUID/UUID codecs.
- Implement date/time codecs where verified.
- Implement bit-field helpers.
- Implement enum codecs that preserve unknown numeric values.
- Implement bounded length-prefixed property and primitive framing.
- Verify two-byte-length plus type-byte record framing where it occurs.
- Support record formats with alternate header sizes.
- Detect record lengths that exceed the containing stream.
- Preserve unknown property-record payload bytes.
- Preserve padding and alignment bytes.
- Preserve decoded record ordering.
- Add record-level dirty tracking.
- Serialize untouched records from their original payload bytes.
- Add hex-dump and annotated-record debugging utilities.
- Add differential tests against an independent parser where licensing permits.
- Fuzz every binary primitive and record-framing codec.
- Identify and verify the
Board6root/header streams. - Inventory all stream/storage families in the binary reference corpus.
- Verify the
*6stream convention against the current corpus. - Implement board property/header stream parsing.
- Implement layer-stack metadata parsing from board properties.
- Implement component property stream parsing.
- Implement net property stream parsing.
- Implement class property stream parsing.
- Implement rule stream parsing.
- Implement initial track stream parsing.
- Implement initial arc stream parsing.
- Implement initial pad stream parsing, including nested subrecord framing and common geometry fields.
- Implement initial via stream parsing.
- Implement text stream parsing.
- Implement fill stream parsing.
- Implement region stream parsing.
- Decode source
ShapeBasedRegions6geometry separately from generatedRegions6fill caches. - Decode and classify
BoardRegionslayer-stack-region geometry in the current binary corpus. - Verify binary physical board-cutout regions against a real fixture.
- Decode extended region vertices with arc centers, radii, and angles.
- Implement polygon property stream parsing; binary polygon primitives and pours remain pending.
- Implement dimension stream parsing.
- Implement component-body stream parsing.
- Implement model metadata and embedded model stream parsing.
- Implement wide-string table parsing.
- Resolve stream-local string/index tables.
- Resolve owner, component, net, rule, and polygon indexes.
- Preserve unknown streams without decoding them.
- Preserve unknown records inside known streams.
- Build the same semantic PCB model from ASCII and binary input.
- Serialize model edits back to binary streams.
- Add binary-to-ASCII and ASCII-to-binary conversion only after both serializers are independently reliable.
- Validate rewritten documents by reopening them in Altium Designer.
- Add an
AltiumSchDocroot class. - Add
parseAltiumSchDoc(). - Detect ASCII and binary schematic variants.
- Parse and validate schematic headers.
- Add parent/owned-record queries from owner indexes.
- Preserve record order independently of ownership queries.
- Parse sheet/header records as source-preserving property records.
- Implement component records.
- Implement common pin property records.
- Implement IEEE symbol records.
- Implement labels and net labels.
- Implement wires and junctions.
- Implement buses.
- Implement ports and power ports.
- Implement harness connectors, entries, and harness wires.
- Implement No ERC markers.
- Implement parameter-set objects.
- Implement designators.
- Implement parameters.
- Implement arcs and elliptical arcs.
- Implement polylines and polygons.
- Implement ordinary schematic line primitives.
- Implement rectangles, rounded rectangles, and ellipses.
- Implement clipped, wrapped text-frame records.
- Implement notes.
- Implement image property records.
- Decode embedded schematic bitmap storage and render it as portable PNG data in SVG previews.
- Implement sheet symbols and sheet entries.
- Implement sheet names and sheet filenames.
- Implement templates.
- Implement hyperlinks.
- Implement implementation-list and model-link records.
- Select and render the active part of multipart components.
- Implement alternate graphical display modes.
- Implement hidden pins and pin electrical types.
- Implement pin name/designator text positioning.
- Render schematic text and net-label orientation with all nine Altium justification modes.
- Implement unique-ID and ownership reference resolution.
- Implement hierarchical document links.
- Implement multichannel/repeated-sheet metadata.
- Implement variant and fitted-state metadata.
- Preserve unknown schematic record IDs and property fields.
- Verify historical record IDs against fixtures before documenting them as stable.
- Add exact round-trip fixtures for every supported schematic version.
- Add an
AltiumSchLibroot class. - Add
parseAltiumSchLib(). - Parse library header and component index information.
- Enumerate component storages.
- Parse component aliases.
- Parse multipart component definitions.
- Parse display modes.
- Parse pins and graphical primitives.
- Parse component parameters.
- Parse linked footprint/model implementations.
- Parse simulation and signal-integrity model links where present.
- Preserve per-component raw storage data.
- Add ergonomic component lookup by name and alias.
- Add library component insertion/removal APIs.
- Add deterministic component storage naming.
- Round-trip libraries with Unicode component names.
- Round-trip libraries with duplicate or unusual aliases.
- Validate rewritten libraries in Altium Designer.
- Add an
AltiumPcbLibroot class. - Add
parseAltiumPcbLib(). - Parse library headers and footprint indexes.
- Enumerate footprint/component storages.
- Parse footprint pads, tracks, arcs, fills, text, and regions.
- Parse footprint component bodies and 3D models.
- Parse height, courtyard, assembly, and placement metadata.
- Parse footprint parameters and descriptions.
- Parse footprint origin and reference point.
- Preserve per-footprint raw storage data.
- Add ergonomic footprint lookup.
- Add footprint insertion/removal APIs.
- Add deterministic footprint storage naming.
- Round-trip Unicode footprint names.
- Validate rewritten libraries in Altium Designer.
- Identify and document the integrated-library container structure.
- Add an
AltiumIntLibroot class. - Add
parseAltiumIntLib(). - Enumerate embedded schematic libraries.
- Enumerate embedded PCB libraries.
- Enumerate embedded model and database assets.
- Preserve unknown embedded files.
- Expose embedded files without eagerly parsing all of them.
- Allow extraction of embedded libraries.
- Allow replacement of one embedded library.
- Rebuild integrated libraries deterministically.
- Validate rebuilt integrated libraries in Altium Designer.
- Add an
AltiumPrjPcbroot class. - Add
parseAltiumPrjPcb(). - Preserve INI section and key ordering.
- Preserve duplicate keys and comments.
- Parse document paths and document kinds.
- Parse project options.
- Parse project parameters.
- Parse compiler and ECO settings.
- Parse variant definitions.
- Parse alternate-part definitions.
- Parse fitted-state definitions from a fixture.
- Parse parameter variations.
- Resolve project-relative paths.
- Support Windows path semantics without requiring Windows.
- Preserve unknown project sections and keys.
- Decide whether
.DsnWrkand session files are in scope. - Parse workspace project lists.
- Preserve UI/session state separately from design data.
- Avoid serializing machine-specific absolute paths unless explicitly changed.
- Add an
AltiumOutJobroot class. - Add
parseAltiumOutJob(). - Parse output generators.
- Parse output containers.
- Parse variants and data sources.
- Parse and classify Gerber/ODB++/IPC-2581 output settings.
- Parse and classify NC drill output settings.
- Parse and classify pick-and-place output settings.
- Parse and classify BOM output settings.
- Parse and classify drawing/PDF output settings.
- Parse and classify report and validation outputs.
- Preserve unsupported output types and provider-specific settings.
- Define exact, structural, and semantic round-trip levels.
- Report which level is available for a parsed document.
- Return the original bytes for untouched binary documents.
- Return the original text for untouched text documents.
- Preserve unknown fields, records, streams, and embedded blobs in the read-only source model.
- Preserve original line endings.
- Preserve original encoding when possible.
- Preserve numeric precision and exponent formatting.
- Preserve duplicate keys and their positions.
- Preserve padding and alignment bytes.
- Preserve empty streams and storages.
- Preserve timestamps unless a caller opts to update them.
- Preserve GUIDs and unique IDs unless a caller opts to regenerate them.
- Define deterministic formatting for newly authored text records.
- Define deterministic binary record ordering for newly authored content.
- Define where canonicalization is allowed.
- Add serialization options for canonical versus preserve-source modes.
- Add atomic file-writing helpers for Node/Bun.
- Add validation before serialization.
- Refuse serialization when an edit cannot be represented safely.
- Surface lossy operations explicitly.
- Test parse → serialize → parse model equivalence.
- Test byte equality for untouched documents.
- Test targeted text edits with minimal diffs.
- Test targeted binary edits with minimal diffs after binary writing exists.
- Test files by reopening them with Altium Designer when available.
- Build document indexes lazily.
- Resolve component ownership.
- Resolve net ownership.
- Resolve primitive-to-rule relationships.
- Resolve polygon source/generated relationships.
- Resolve schematic owner indexes.
- Resolve hierarchical sheet relationships.
- Resolve library references.
- Resolve model and footprint implementations.
- Resolve project document references.
- Represent missing targets without destroying raw IDs.
- Detect duplicate unique IDs.
- Add optional unique-ID regeneration.
- Update dependent references when IDs/indexes change.
- Reindex collections safely after insertion/removal.
- Add connectivity graph APIs.
- Add schematic net graph APIs.
- Add board layer-stack queries.
- Add component/pad/pin cross-probing helpers.
- Add project-level document graph APIs.
- Keep semantic indexes out of deterministic serialized output.
- Add structural validation for currently parsed root formats.
- Add required-field validation for typed records.
- Add enum-value validation while preserving unknown values.
- Add owner/index bounds validation.
- Add unique-ID collision validation.
- Add layer-stack, layer-pair, and impedance-profile reference validation.
- Add primitive layer-reference validation for every verified layer naming variant.
- Add net-reference validation.
- Add rule constraint range validation.
- Add geometry sanity validation.
- Add polygon contour validation.
- Add schematic ownership-cycle validation.
- Add project path validation.
- Add container stream consistency validation.
- Separate errors from warnings.
- Allow callers to select validation profiles.
- Avoid pretending to replace Altium's full DRC/ERC engines.
- Export machine-readable validation results.
- Attach validation results to source locations.
- Add repair suggestions without automatically mutating documents.
- Add object-shaped ergonomic constructors for every typed node.
- Add normalized inputs for points, sizes, angles, and measurements.
- Add document methods for inserting/removing records.
- Add component methods for owned primitives.
- Add board/document methods for nets, classes, and rules.
- Add schematic document methods for components, wires, labels, and ports.
- Add library methods for components and footprints.
- Add project methods for documents and variants.
- Add safe ID/index allocation.
- Add safe PCB net rename operations.
- Add layer reassignment helpers.
- Add net reassignment helpers.
- Add component transform helpers.
- Add batch edit transactions.
- Add undoable change-set representation.
- Add document diff generation.
- Add patch application with conflict diagnostics.
- Add source-preserving edits where only changed fields are rewritten.
- Document which APIs can cause canonical reserialization.
- Define a conversion boundary between altiumts syntax models and Circuit JSON.
- Convert Altium PCB layers to Circuit JSON layers.
- Convert components and footprints.
- Convert pads and holes.
- Convert tracks, arcs, vias, fills, regions, and polygons.
- Convert nets and connectivity.
- Convert text and board outlines.
- Convert schematic components and pins.
- Convert wires, labels, buses, ports, and power symbols.
- Preserve source IDs for traceability.
- Emit diagnostics for unsupported conversion features.
- Avoid putting Circuit JSON dependencies in the low-level parser core.
- Add optional adapters in a separate module or package.
- Add Altium-to-Circuit-JSON integration fixtures.
- Add Circuit-JSON-to-Altium experiments only after authoring is stable.
- Document unavoidable semantic mismatches.
- Add unit tests for basic ASCII parsing and mutation.
- Add an exact real-file ASCII
.PcbDocround-trip test. - Add
bun-match-svgvisual regression infrastructure. - Add SVG snapshots for every imported PCB and schematic reference.
- Add full-PCB and per-layer visual snapshots.
- Add a complete top-layer snapshot for the TI TMDS62LEVM production board.
- Add parse, strict-validation, exact-round-trip, and named SVG snapshots for all 57 TI TMDS62LEVM schematic sheets.
- Add board-coordinate
viewBoxcrops for focused PCB snapshots. - Add focused snapshots for pad stacks, rounded rectangles, and slots.
- Add focused snapshots for rotated binary fills.
- Add a focused polygon-cutout snapshot.
- Add an isolated mechanical-layer snapshot for component-body contours.
- Add component-owned and net-isolated PCB snapshots.
- Add tests for every public class and helper.
- Add tests for every known ASCII record kind.
- Add tests for every binary record codec.
- Add tests for each currently supported ASCII/binary PCB and schematic root.
- Add tests for every supported Altium version.
- Add tests for mixed and unusual encodings.
- Add tests for Unicode identifiers and values.
- Add tests for duplicate fields and records.
- Add tests for empty fields, records, streams, and documents.
- Add initial tests for malformed and truncated compound-file input.
- Add initial tests for integer overflow and pathological lengths.
- Add tests for cyclic and invalid CFB sector chains.
- Add initial tests for parser resource limits.
- Add property-based tests for text field parsing.
- Add property-based tests for measurement parsing.
- Add property-based tests for record framing.
- Add fuzz testing for ASCII parsing.
- Add fuzz testing for CFB parsing.
- Add fuzz testing for every binary stream parser.
- Add mutation fuzz tests followed by reparse.
- Add snapshot tests for canonical newly authored output.
- Add structural equivalence tests after round trips.
- Add minimal-diff tests for targeted edits.
- Add cross-runtime tests for Bun and Node.js.
- Add browser bundling tests.
- Add performance regression benchmarks.
- Add memory-use regression benchmarks.
- Add coverage reporting with meaningful per-format targets.
- Add a nightly extended-corpus test workflow.
- Keep PR CI fast with a representative smaller corpus.
- Add optional Altium Designer smoke tests on an appropriate licensed runner.
- Treat all input files as untrusted.
- Bound allocations derived from file and record length fields.
- Bound recursion and ownership-tree depth.
- Bound record, field, stream, and directory counts.
- Detect arithmetic overflow before slicing or allocating.
- Reject paths that escape an extraction directory.
- Sanitize embedded filenames during extraction.
- Avoid executing or dynamically importing embedded content.
- Avoid catastrophic regular expressions.
- Add cancellation points for long text operations.
- Add
AbortSignalsupport to async text parsing. - Avoid exposing sensitive source data in thrown errors by default.
- Run dependency audits and keep the checked-in graph advisory-free.
- Pin GitHub Actions by trusted major versions or commit hashes.
- Add CodeQL or an equivalent static-analysis workflow.
- Add dependency update automation.
- Add fuzzing crash corpus retention.
- Document the security-reporting process.
- Establish baseline parse/serialize benchmarks.
- Benchmark small, medium, and very large boards.
- Include a very large production board in the repeatable benchmark corpus.
- Benchmark large schematic and PCB libraries.
- Avoid copying entire binary buffers unnecessarily.
- Use bounded views/slices for record payloads.
- Add lazy stream decoding.
- Add lazy semantic index construction.
- Add streaming ASCII parsing.
- Add incremental serialization where safe.
- Add cancellation points in long-running text parses.
- Document expected memory overhead.
- Detect performance regressions in CI.
- Keep convenience indexes optional for low-memory use.
- Evaluate worker-thread/Web Worker parsing for large files.
- Add basic PCB-to-SVG serialization.
- Add basic PCB-layer-to-SVG serialization.
- Add basic schematic-sheet-to-SVG serialization.
- Add a CLI package or
altiumtsbinary. - Add
altiumts inspect <file>. - Add
altiumts tree <file>. - Add
altiumts streams <file>. - Add
altiumts records <file>. - Add
altiumts validate <file>. - Add
altiumts roundtrip <file>. - Add
altiumts diff <before> <after>. - Add
altiumts extract <file>. - Add
altiumts fixture-info <file>. - Add JSON output for automation.
- Add bounded hex dumps for unknown binary records.
- Add source-location display for text records.
- Add a browser-based document inspector.
- Add a record/stream search UI.
- Add a fixture corpus report.
- Add scripts for identifying new record kinds and fields.
- Add scripts for comparing output across Altium versions.
- Add a release-size check.
- Add API Extractor or equivalent public API review if needed.
- Document the initial ASCII
.PcbDocAPI. - Document the current binary/schematic capabilities and limitations.
- Add architecture documentation.
- Add a concise supported-format summary to the README.
- Add a version compatibility table.
- Document strict, permissive, and recovery modes.
- Document round-trip guarantee levels.
- Document unknown-node behavior.
- Document mutation and dirty-state behavior.
- Document encoding behavior.
- Document measurement and coordinate handling.
- Add an ASCII PCB inspection/edit example.
- Add a targeted PCB edit example.
- Add a binary PCB inspection example.
- Add a schematic inspection example.
- Add a schematic-library lookup example.
- Add a PCB-library footprint extraction example.
- Add a project variant example.
- Add a Circuit JSON conversion example.
- Add API reference generation.
- Add contributor guidance for implementing a new record class.
- Add contributor guidance for adding licensed fixtures.
- Add format-research notes.
- Add a changelog.
- Add a security policy.
- Add a code of conduct if required by the organization.
- Produce ESM and
.d.tsoutputs. - Verify package contents with
npm pack --dry-run. - Decide that CommonJS output is not required for the ESM-first package.
- Add explicit
sideEffectsmetadata. - Add runtime and package-size budgets.
- Add a package export subpath for Node-only helpers.
- Keep Node-only helpers out of the browser-compatible core export.
- Add browser bundle validation.
- Add source maps.
- Add provenance/SBOM generation.
- Add npm publishing automation.
- Add versioning automation consistent with tscircuit repositories.
- Add pre-release channels for experimental format support.
- Define semantic-versioning rules for AST changes.
- Define how newly recognized unknown records affect versioning.
- Publish release notes with compatibility changes.
- Sign or attest release artifacts.
- Verify clean installation in a new project.
- Verify TypeScript imports under common module-resolution modes.
- Verify Bun and Node.js ESM consumption.
- Publish only after the public API and support claims match reality.
- All common PCB record kinds in the corpus have typed classes.
- Unknown records and fields round-trip exactly.
- Every corpus fixture round-trips exactly when untouched.
- Diagnostics include useful line/record context.
- Resource limits and fuzz tests are in place.
- The compatibility matrix accurately describes tested versions.
- The public ASCII API is documented and stable.
- CFB parsing is bounded and security-tested.
- Common PCB streams and records are decoded.
- Unknown streams and records are preserved.
- Binary documents build the shared semantic PCB model.
- The binary corpus reparses successfully after untouched serialization.
- Targeted edits can be reopened in Altium Designer.
-
.SchDoc,.SchLib, and.PcbLibroot parsers are available. - Ownership and reference graphs are resolved without losing raw IDs.
- Common schematic and library entities have typed models.
- Unknown schematic records remain round-trippable.
- Real-world hierarchical and multipart fixtures pass.
- Dirty tracking limits rewrites to changed data where feasible.
- Typed authoring APIs allocate references safely.
- Structural validation runs before writes.
- Lossy edits are rejected or explicitly acknowledged.
- Rewritten files pass independent parsing and Altium smoke tests.
- Exact, structural, and semantic round-trip guarantees are documented.
- Circuit JSON adapters cover the agreed PCB and schematic subset.
- CLI inspection and validation tools are available.
- Browser and Node/Bun consumption tests pass.
- Package publishing and provenance automation are operational.
- Documentation and compatibility claims are complete for the tested corpus.
- The remaining unsupported features are clearly enumerated.