Repository navigation
Releases
specify-core 0.1.12
Added
- How a part is made:
part.process(machined,3D printed: FDM,resin,powder,
metal,sheet metal,moulded,cast), asked last of every made part, after all
existing questions, and never blocking a write. With no answer and no file value a part is
machined and every question, default and write is unchanged; the machined default is never
added by accepted defaults. A printing-class material suggests its printed process
(attentioncheck). The process sets defaults only: printed parts default to a ± general
tolerance from vendor figures (written as a part note, as the kernel's general tolerance is an
ISO 2768 class), clearance holes without an H11 fit, withheat-set insertand
printed threadoffered (written as hole notes) and ± locations, and are not asked roughness, edges or coating;
sheet metal, moulded and cast parts are not asked roughness. An answer such a process leaves
unasked, or only another process offers, is anunaskedrow (#126). Stored as the CAx-IF UDA setspecify process
(manufacturing_process) on each product definition, with the BOM's
default.manufacturing_processmarker for an accepted suggestion; read back as answered,
file (another tool's) or default, and a stated value is not asked. Bought parts are asked
no process. Shared by native/CLI, serve, Python and WASM questions, apply and write; an older
Specify refuses an answer file holdingpart.process. Seedocs/process.md. specify-core completions SHELLprints a shell completion script (bash, zsh, fish,
powershell or elvish) to stdout; the README gives the install one-liners.
Changed
- The command line is parsed by clap instead of a hand-written argparse-style parser. Commands,
arguments and defaults are unchanged, and so are exit codes for everything that worked before
(usage errors still exit 2), but help and
usage errors are clap's text rather than argparse's, and-hand--helpboth give a
command's full help. The top-level help now listsdiff,openandbom, which were left
out to match Python's text, and a prefix of--helpat the top level (--he,--h) prints
the help (exit 0). Positionals after an option are taken:write S A B -o OUT C Dwrites both
pairs andwrite S A -o OUT Bthe pairA B, where argparse leftC DandB
unrecognised. The WASM build leaves the command line out (the root crate's defaultcli
feature, off forspecify-core-wasm). specify-core open's help and the README name the prompt Chrome shows the
first time ("draftwright.io wants to access other apps and services on this device"): Allow
lets the page fetch the file; if it did not open while the prompt was up, stop the command
and run it again; a Block is undone in draftwright.io's site settings.
specify-core 0.1.11
Fixed
- The BOM
stockproposal follows make/buy: bought parts (such as the gramil grub screw,
washers and pan-head screws) are proposedfrom stock, made partsto be made, and
not knownproposes nothing. Before, every part was proposedto be made, so accepted
BOM suggestions marked bought hardware as made in-house. Applies tobomrows, the
bom.stocksuggestion andaccept_suggestions(where an explicitbom.make_buyanswer
decides it); explicit and file stock values are unchanged. A stock suggestion accepted
into a file before this fix is re-proposed from make/buy when the BOM is read.
specify-core 0.1.10
Added
- Review
problemsstate each sealed interior void (aninterior_voidsfeature whose
kernel record is aclosed_shellmeasurement) as aninfofact with
code: "interior_void", itsfeature,faces, the kernel'sestimated_volumeand,
for a capped cylinder,diameterandlength: "Closed internal cavity ⌀2.5 × 12
long: no opening to the outside; can't be drilled, tapped or moulded as modelled."
Grid-sampled chambers behind openings are not stated. Shared by native review, serve,
Pythonproblemsand WASMreview; no question is added or removed. specify-core open STEPopens a STEP file in draftwright.io/specify (--editor: /editor)
with nothing to click and nothing uploaded: the file is served once on 127.0.0.1 at a
random one-off address, to the editor's origin only (with Chrome's Private Network Access
preflight), and the command exits once it is fetched or after 10 minutes.--site ORIGIN
points it at another deployment;--no-browserprints the address instead of opening it.
Changed
- Move native, WASM and Python builds from quiddity/haecceity v0.4.6 to v0.4.7
(dcba9d38). Sealed interior voids are reported only asinterior_voids(each
sealed shell gets an exactclosed_shellrecord), no longer also as holes.
Dimensions with no stated value are written through unchanged; a projected zone
with no end geometry is read as afactfinding. An Add needing the new R3
integer-literal repair is refused with its ids, as R1/R2 are. Recognition/6, fingerprints
/3and both packaged schemas are unchanged. - Adopt reader
haecceity-pmi-read/17in place of /15. - Add optional
retained_shared(ids of auxiliary support Replace kept for PMI it
cannot read) to native/CLI, Python and WASM write reports. - Known differences: NIST CTC-04's projected zone #18897 is a
factfinding (formerly
nonconformance); cgb217's void shell (faces 361-363, fromBREP_WITH_VOIDS) is a
Rust-only interior void, and its two former cylindrical-profile entries are kept as
resolved. Cross-engine byte goldens, readbacks and no-BOM hashes are unchanged.
WASM API
WriteReportadds optionalretained_shared: number[], absent when empty.
specify-core 0.1.9
Added
- Export the complete answer set before writing with
questions --resolve-defaults --step STEP, serveexport_answers, Pythonapi.export_answersand WASM
engine.exportAnswers. Accepted defaults are explicit, including dependent questions;
sidecars carry verified_specify.evidence, sort keys recursively and refuse incomplete
sets or unresolved carries. Existing partial-default operations keep their shape.
WASM export and write check evidence before feature IDs, so a full old map with
disappeared features reports stale geometry rather than an unknown feature. - Add Amy's cadgen PMI plate (gist, MIT) as a fixture with cadgen's own AP242 semantic
PMI. Tests check that it reads once as foreign PMI: ISO 2768-mK general tolerance, basic
30/50, and no extra Specify size or location requirement beside its dimensions.
Changed
- Move native, WASM and Python builds from quiddity/haecceity v0.4.4 to v0.4.6
(1ebf8cb6).
Add preserves original entity bytes in the kernel; a datum on a kept carrier
gets a separate.T.datum feature. Add upgrades requiring source repairs
refuse with entity ids and repair details, without a Replace retry. PMI-less
inputs continue selecting Replace before writing. - Share per-face geometry carriers and reference datum features directly (quiddity#181).
Specify stamps new complex carriers and protects carriers and face support shared
with foreign requirements during owned-item removal; characteristic numbers stay stable. - Adopt reader
haecceity-pmi-read/15in place of /14, including authored standalone
members namedhaecceity.feature/1. A datum whose feature reaches no face is an
Unresolvedfinding, surfaced as a newPMI unresolved datum …analysis/CLI warning. - Refresh cross-engine STEP byte goldens and four no-BOM hashes for shared-carrier
and direct-datum links and quiddity#184's notes placement clear of drawn ink. Per-case
reasons are documented in the fixture README. All fourteen independent Python
semantic readbacks remain identical; both part-index refusals stay fixed. - Add optional
geometry_carrier_exemptions({part, condition, aspect, feature}),
preserved_normalizations({id, normalization}) andpresentation_warningsto
native/CLI, Python and WASM write reports. Update the packaged presentation schema
for optional model-spaceGraphic.leader; the semantic schema stays unchanged. - Source the v0.4.6 kernel from
pzfreo/quiddity, renamed frompzfreo/quiddity-rust.
The crates remain namedquiddityandhaecceity; GitHub redirects the former URL.
Fixed
- An answer valid in form whose question is not asked given the other answers (e.g.
datum.A.flatnessorhole.position:*withpart.locating"± dimensions") is listed in
every write report'snot_writtenwith the reason, instead of being dropped silently. It
stays stored and exported;applydoes not refuse it. Rustapi, CLI, serve and Python now
refuse an answer ID no question can have (unknown answer ID), as WASM already did.
A carry block applies only while its question is asked; otherwise it is listed the same
way, and it refuses again once later answers ask the question. A STEP keeps such a block
in its stored-answers payload (unresolved, besideanswers) and restores it on reopening;
older builds ignore it. Unknown IDs stored by earlier versions are left out on reopening
with a warning, not refused.previewno longer computes these rows; the editor's write
adds them. For #126. - Preserve dropped revision-stable datum/part/BOM answers as
_specify.unresolved
carry blocks: CLI, serve, Python and WASM bulk defaults cannot silently replace them.
Failed feature carries remain report-only: old face-based IDs may name a different
feature in the destination. Explicit answers clear stable question blocks, which
questionsand review now show as required, with no default and the diff reason.
Diff answer maps also carry the in-STEP face evidence; write refuses
stale evidence before output, naming CLI answer files and directing callers to diff.
Plain maps remain compatible and cannot detect changed in-range face identities.
Re-rundiffto regenerate changes files from released v0.1.8 and earlier: their
metadata-freechanges/answers.jsoncannot reveal dropped answers, so the literal
old-filewrite --accept-defaultsrepro still exits 0 on updated tools.
Older Specify/editor WASM builds reject new_specifymaps asunknown answer ID;
older CLI and Python installs may accept and ignore_specify, without its evidence and
carry-block checks. Old plain files remain compatible with new tools. - For #123, #124, #125: diff maps an added requirement's (
extra.*)facesand
referencethrough the same face matching as datums, on unnamed parts as on named
ones, instead of keeping old indices that could name another feature under anok
verdict. A face with no match leaves itorphaned, severalambiguous. A carried
answer the new part refuses (a size whose two holes now differ) is listed as
unresolvedwith the refusal instead of raising, so the rest of the report is
returned. A refusal naming no answer is pinned only on one whose removal clears it;
otherwise the answers stay carried and the report adds acarry_refusedproblem.
Droppedextra.*answers are_specify.unresolvedcarry blocks: write
and bulk defaults refuse until the requirement is answered again or its entry removed. - Diff refuses stale answer evidence with exit 2 and asks for the matching old part,
instead of suggestingdiffagain while already comparing revisions. - Diff folds a thread's own
thread manufacturingnote into its thread item when
owner id, faces and drawing wording agree. Added, removed and changed threads
appear once; manufacturing-only edits still change the thread item with its
drawing wording. Other manufacturing notes remain separate across native, CLI,
WASM and Python diff. - Analysis
existingrecords (and PythonExistingPmi) mark a basic dimension with
basic: true, as does the scene'sspecify[id]metadata, and diff words add(basic).
Basic dimensions such as cadgen's "theoretical" 30 and 50 on the PMI plate were read by
haecceity as basic but reported as plain untoleranced dimensions.
WASM API
- Add
IntentEngine.exportAnswers(answers: string): stringfor complete, deterministic
answer sidecars with geometry evidence; incomplete sets and carry blocks throw. - Add
AnswerFileMetadatafor optional_specify.evidenceand_specify.unresolved
in answer maps; default acceptance and writes enforce carry blocks and face evidence. PmiSceneMetadataadds optionalbasic: truefor a basic (theoretically exact) dimension.- Add
WriteReport,GeometryCarrierExemptionandPreservedNormalization
interfaces, with optionalgeometry_carrier_exemptions,presentation_warnings
andpreserved_normalizationsreport keys. Expose optionalPmiSceneGraphic.leader
in millimetres.
Kernel note: specify-core-rust uses haecceity tag v0.4.6, quiddity tag v0.4.6; pzfreo/draftwright-rust@v0.2.10 uses haecceity tag v0.4.7, quiddity tag v0.4.7. Different kernels may number STEP faces differently.
specify-core 0.1.8
Added
- Preserve answered and imported limit dimensions through STEP, resume, scene labels and
diff reports; size and distance answers accept lower/upper slash bounds. Analysis and
Python existing-PMI records expose optional absolute limits alongside derived deviations.
Size write reports now show explicit ± and signed deviation bands as well as fits and limits. - Offer ISO 2768 f/m/c/v × H/K/L combined general-tolerance classes and round-trip their
geometric class, retaining the ISO 2768-m default and existing linear tables. - Add the shared text-to-cad PMI plate from pinned cadgen 0.8.3 exports, with
regeneration source and MIT attribution. Tests cover Specify-authored PMI,
schema-3 face names, all 16 answers surviving thickness/bore edits, and the
current added-hole result: 12 attached, four explicitly unresolved after
cadgen renames supports. Verify written face names and AP242 PMI anchors.
Changed
- The Python package's links and the step-diff README point at draftwright.io; the step-diff
handoff accepts/difffrom both draftwright.io and editor.draftwright.io (#108, #112). - Store supplied answers in Add mode beside foreign PMI. Resume keeps unmarked PMI in
existing; mixed rewrites replace only Specify's provenance-marked requirements and
preserve their characteristic numbers while retaining foreign entity bytes. Scoped saves
supersede stale legacy answer frames without removing their unmarked records.
Fixed
- An intent no longer lists the file's own stated dimensions as requirements. The shared
planner still uses them, so General guesses stay off those features, but the file's PMI
stays the characteristic: on NIST CTC-01 the editor showed every toleranced hole twice,
once with Specify's bare nominal. Written STEP bytes are unchanged. - Answered diff scenes remove replaced file identities together with their PMI
rows before merging retained CAD requirements, keeping semantic links and old
callouts consistent with each scene's own document. - Every diff pairing pass checks requirement kinds and known measurement roles,
including number and id matches. Thread callouts cannot pair with location
dimensions; location roles follow the part's rotation during comparison.
Kernel note: specify-core-rust uses haecceity tag v0.4.4, quiddity tag v0.4.4; pzfreo/draftwright-rust@v0.2.9 uses haecceity tag v0.4.3, quiddity tag v0.4.3. Different kernels may number STEP faces differently.
specify-core 0.1.7
On quiddity/haecceity 0.4.4. Adds thread callouts and polyline roles/text cell boxes from 0.4.4, exact tap-drill matches defaulting to tapped holes, one GENERAL NOTES block, a BOM, stable characteristic-number keys (number-history schema 2; 0.1.6 files keep their numbers), and richer diff reports: optional compared scenes, old_id, face anchors, PMI-coloured model.png, geometry-first pairing for freshly planned revisions, and thread-note wording. STEP diff comments no longer carry a JSON payload. presentation.semantic_ids again lists only the PMI document's own ids.
-
Diff retains uniquely matched planned dimensions when their target/reference
supports grow, after exact-face matches and before kind fallback. Measurement
roles distinguish existing bore/pitch/location requirements from new counterbores. -
Diff pairs fresh-numbered plans by requirement/geometry identity; only continued
characteristic-number histories give numbers priority. Thread manufacturing notes
show drawing wording, and semantic-only attribute notes, knurls and finishes show
their values.
WASM assembly diff accepts per-partacceptDefaultsmaps and names the part and
question id when a nested answer is invalid. -
Prefer an exact tap-drill match over an ambiguous smaller clearance screw when suggesting a hole function; accepted tapped holes carry thread semantics without a tap-drill fit. Document and type additive haecceity polyline roles and text cell boxes (pass-through from v0.4.4).
Fixed
presentation.semantic_idslists only the PMI document's own ids again. The
part.materialalias stays initemsandspecify, but no longer appears in
semantic_ids, where consumers that cross-check it against the PMI refused the
whole drawn PMI whenever a material was answered.
Added
-
Diff reports optionally include the exact compared
pmi.scenesthrough Rust,
CLI--pmi-scenes, WASM and Python. Requirement items add differingold_id
and per-side mesh face anchors, including semantic-only requirements. Revision
PNGs draw changed/added presentation callouts and translucent removed ghosts,
framing their supplied geometry alongside existing geometry change colours. -
For #79: opt-in assembly BOM writes via explicit
bom.*answers or--bom/ API
acceptance. Optional questions expose suggestions, never ordinary defaults. Assembly
analysis adds a sourcedbomrow using its existing parse. Separate occurrence UDAs
preserve older-engine resume; explicit answers override current export data, accepted
suggestions do not. Geometric item history tolerates fingerprint drift, small parts
and stable duplicate ordering; removed numbers are retired. Read through Rust, CLI,
Python and WASM. See BOM storage and numbering. -
Regression coverage for #89 using FreeCAD's attributed CC-BY-3.0 hex standoff:
AP214PRODUCT_TYPEupgrades toPRODUCT_RELATED_PRODUCT_CATEGORY, preserving
every other original entity byte, and written PMI/answers read back. Add the
attributed LM10UU fixture to cover independent size supports and unchanged resaves.
Changed
-
Diff reports describe requirements in Markdown and JSON summary text, naming the
changed feature and its requirement notation when review is needed. STEP diff
comments omit the JSON payload and flag differing committed sidecars in one
line, with a 3D review link for public repositories.answers.json, JSON keys
and verdict meanings remain unchanged. -
Refresh the numbered M2 presentation fixture and four distinct no-BOM write
hashes for v0.4.4's added thread ink and neighbouring callout placement.
Legacy semantic/part-setting comparisons and all six exact API/CLI byte
comparisons remain enforced; neither the old semantic inputs nor recognition
expectations change. -
Keep exact tap-drill defaults and their exact-value guards after the main merge:
five frozen rule cases (CGB202, CGB217, CGB243, NIST CTC-04 part 0 and FTC-10)
gain thread/depth answers and dependent ordering; thirteen CLI envelope entries
carry the same reason without wildcard cases or paths. Explicit-clearance fit
tests still choose clearance. Fresh-number order checks replace only the
former tap-drill size with its thread; CGB243's obsolete General-size conflict
disappears while its written count is unchanged. -
Move quiddity/haecceity (native, WASM and the Python binding) to v0.4.4
(53cf3604), including thread callouts, polyline roles and text cell boxes. The pin checker requires the same release. Reader binding advances
tohaecceity-pmi-read/14for datum-constituent identity (#173); the packaged
haecceity.pmi/1schema is byte-identical to upstream and remains unchanged.
Upstream #171 improves callout/frame placement and label packing; #172 bounds
generated STEP string literals and chunks long descriptive values. Recognition /6
and fingerprints /3 are unchanged. -
Read haecceity #172's marked ordered text chunks when recovering saved answers
and carried application payloads. Previously a long saved answer failed write
verification after the kernel bounded its strings; legacy single strings remain
readable. Regression coverage checks long-answer resume/resave and rejects
unmarked, unordered or cyclic compounds. -
For #163: live PMI scenes combine accepted part settings, imported semantic notes and
material in one GENERAL NOTES block, replacing the file block in the scene while
lossless writes keep its records. Reopened appended files also draw one block.
Part-level edge-break prose answerspart.edges
as written. Feature notes retain their owner; haecceity generates their fallback ink
together with the combined block and owns all placement. Rotated-part regression
checks use the notes plane. File callouts
report file source and material DMIAs link throughpart.material. -
For #75, written hole sizes, pattern
origins/pitches and prismatic plane levels/extents follow the shared planner.
Inspection plans contain fewer rows: the default cross-engine plate changes from
21 dimensions / 28 characteristics to 12 / 19. The raw all-General planner has
11 quantities; Specify adds two offsets with distinct Basic/General contracts
and omits the drill already carried by the thread.
Existing numbers win; removed rows retire permanently and the write report
lists their numbers. On the frozen pre-planner
plate, numbers 6–11 and 21–26 retire. New requirements allocate above the
previous high-water mark. Deferred feature owners retain their existing path.
Locations require real face supports; thread drills and duplicate legacy spans
are stated once. Answered fits and Basic locations retain their contracts, including the radial
bolt-circle diameter belonging to a position frame.
Determined enlargement depths are reference dimensions. Unknown-bottom depths
and bounded shoulder stations that lack unambiguous semantic supports are
reported instead of adding inspection constraints; physical-plane witnesses
keep their legacy path.
General-tolerance range selection uses the same six-decimal nominal as the
written dimension, keeping boundary values stable under rigid moves. Source
metadata for newly shared dimensions names their complete measured target. -
For #79: record the additive assembly
analysis.bomfield in the per-part oracle
ledger, preserving all legacy layout/value assertions and opt-in write behavior.
Review the three--bomCLI usage/help departures with exact text assertions;
retain the datum-origin snapshot and revalidate ordinary write bytes against main. -
For #79: preserve opt-in BOM alongside shared planner dimensions; ordinary writes
are checked byte for byte against main 8d5a040 through the CLI and API. -
Earlier v0.4.2 upgrade (
d7112fd), retained as recognition evidence:
Recognition /6 and fingerprints /3 stay unchanged; turned steps with spanner
flats, grouped interrupted torus fillets and unproved corners follow upstream #167.
PMI now repairs reversed bounds and datum-feature child aspects (#168), and
duplicate source identifiers and incomplete non-runout zones (#170). -
Refresh the packaged PMI schema for optional per-item
identifiervalues.
The documented reader binding moves fromhaecceity-pmi-read/11to/13
because #168/#170 change readings and findings; Specify always rereads STEP. -
Rejudge the frozen-Python recognition ledger for v0.4.2's grouped interrupted
fillets and omitted unproved bevel corners. Retain 192 retired paths as resolved
assertions and add 266 exact case/path judgments, with a native torus audit of
all 44 changed groups (220 patches); do not regenerate the Python captures.
Inventory tests count torus patches, retaining their original coverage thresholds. -
Revalidate v0.4.2 after merging #91's planner dimensions and #94's opt-in BOM.
Regenerated cross-engine byte goldens and independently recaptured Python readings
remain unchanged from main, including both refusals. The pin checker now requires
v0.4.2 as well as matching native/WASM manifests.
Fixed
-
For #96: give characteristic-history schema 2 an explicit text vocabulary, independent
of Rust Debug and generated planner IDs. Keep fit classes, modifiers and values out of
identity; compare temporary matching hints as typed values. Pin readable keys and
preserve all six numbers when upgrading a file written by the v0.1.6 engine. -
For #95: keep characteristic numbers through tolerance value and material-modifier edits,
so diff reports one changed requirement without a spurious renumbering. History schema 2
uses structural requirement identity; schema-1 files retain their numbers and high-water
marks on migration. Removed numbers stay retired. -
The step-diff Action's "answers carried" block hides Specify's own
_specify*
records (such as_specify_characteristic_numbers) at any depth. They stay in...
specify-core 0.1.6
On quiddity/haecceity 0.4.1. Adds answers keyed by authored STEP face names (#87, cadgen's f: names), adopts 0.4.1's presentation (callouts by their features, one numbered GENERAL NOTES block, plane views, stroked text), adds PmiScene TypeScript types, and builds the Linux command line against glibc 2.28 so it runs on Amazon Linux 2023 and other older distributions. Feature-on scenes and written STEP layouts change with the new presentation. Named parts store answers schema 3; unnamed parts are unchanged.
Changed
- Compare and label each part note by its semantic wording, so a change
within the shared GENERAL NOTES graphic leaves other note requirements unchanged. - Pin quiddity and haecceity to v0.4.1. Recognition
/6and fingerprints/3
stay unchanged. Adopt regenerated ladders/callouts, one numbered GENERAL NOTES
block, generated plane views, AP214 PRODUCT_TYPE upgrades, panic isolation and
graphical callout reading; feature-on scenes and written STEP layouts change. - Build the Linux CLI against glibc 2.28 using pinned Zig/cargo-zigbuild tools;
check its symbols and revision smoke on Amazon Linux 2023 and AlmaLinux 8.
Release asset names and archive layout stay the same. - Preserve optional text-placement
strokedflags in PMI scenes; prune saved-view
references when graphics are filtered or replaced, removing empty views. - For #87: only unique names in the authored
f:namespace become
face identities. Shared names and generic/class labels (including singletons)
retain geometric evidence and schema 2 when no usable identities remain. Omit
unusable labels from analysis; retain the full oracle comparison unchanged.
Added
- For #87: carry authored STEP face names in analysis and stored-answer schema 3.
Resume and diff match names exactly before unnamed geometric supports; missing or
duplicate names leave answers unresolved. Unnamed parts retain schema 2 and their
existing bytes. See face-name compatibility.
WASM API
- Add optional
PmiSceneMetadata.notationfor individual semantic note labels;
shared presentation graphics retain their render-once identity and geometry. - Add
PmiSceneJSON result interfaces for bothpmiSceneentry points, including
semantic rows/ids, graphics, optionalstrokedtext placements, planes, views and
Specify statuses. Document parsing and rendering; the wire return remains a string. - For #87: snapshot faces add optional
name; evidence adds schema 3face_names
and optional mixed-partgeometry. Add descriptiveAnalysisFaceand
AnswerEvidenceJSON types; existing methods and answer shapes are retained.
Kernel note: specify-core-rust uses haecceity tag v0.4.1, quiddity tag v0.4.1; pzfreo/draftwright-rust@v0.2.7 uses haecceity tag v0.2.6, quiddity tag v0.2.6. Different kernels may number STEP faces differently.
specify-core-rust 0.1.5
On quiddity/haecceity 0.2.8. Adds pmiScene (one PMI scene for the editor's Specify, diff and viewer), rebuilds diff's PMI section on haecceity PMI with characteristic numbers, records dimension origins (#77), and adds pmi_scene and api.diff to the specify-core Python package. diff's pmi.stored/pmi.existing are deprecated in favour of pmi.items. The WASM ceiling is now 15,000,000 bytes.
Changed
- Revision PMI reports compare haecceity semantic requirements and full notation,
withpmiSceneids/statuses and inspection numbers, geometry-derived dimensions,
foreign PMI in resumed files, and support matching across face splits. Add
pmi.items; retain deprecatedstored/existingfor one release. Numbered
removals read “retired”; Markdown lists changes in inspection order. - The reviewed WASM size ceiling is raised from 12,980,000 to 15,000,000 bytes (maintainer, 2026-10-31), after
pmiScenemeasured 12,903,620 bytes.
Added
- For #142: native
pmi_scene::Sceneand raw-bytepmi_scene, Pythonpmi_scene
and bundledspecify_core/schema/JSON Schemas. Scenes contain haecceity's
semantic/presentation documents plus Specify status, question, number, origin/source.
Requirement-based Specify ids survive reviews; face anchors match mesh indices. - The Python package
specify-coreon this engine (crates/specify-core-py): specify-core's
Python API and thespecify-corecommand line, with no Python dependency; abi3 wheels for
CPython 3.12 and later, built and published by.github/workflows/python.yml. See
docs/python.md. - Its PyPI page (0.1.4.post1, packaging only): a README for users, with examples checked
against the published package, plus project links, keywords and classifiers. - For #77: each written size/location dimension records its origin and stable geometric
source as a CAx-IF UDA on the dimension itself. Native PMI/analysis and WASM snapshots
expose stored metadata; accepted defaults count as requirements and kept foreign PMI
remains byte-identical. Edition-1 writes upgrade the header to AP242 edition 4.
See dimension origin and source.
WASM API
diffreports addpmi.itemswith ids/numbers matchingpmiScene; export
PmiItemChangeandDiffPmiTypeScript interfaces. Python addsapi.diff
returning the same selected-part report plus Markdown.- Add
IntentEngine.pmiScene(answers)on the open part session (includingopenPart)
andpmiScene(stepBytes, part?)for view-only As Drawn PMI without an interview.
Fixed
- PMI scenes resolve part-setting questions from the rules table and writer's kind
mapping, includingpart.coating. Feature-owned thread/knurl attributes inherit
their requirement's question/status; supporting rows have no interview overlay.
Pattern counts apply only to sizes, locations and tolerances, never datums.
Foreign numeric ids become characteristic numbers only with Specify history.
Python scene answers use the same input validation as WASM.
General locations without a feature id use their face supports for stable identity.
Locations shared by a datum member and its pattern keep their question identity;
repeated measurements retain distinct characteristic numbers through STEP readback. - Scene metadata/history ids follow the requirement owner and property name across
answer changes. Foreign datum identities and file callouts are reused during a live
review, including when adding a control; saved views and planes survive the merge.
Part-default surface finishes retain their #65 characteristic number in live and stored scenes;
their question and the edge-condition question usepart.surface_finishandpart.edges.
Changed
-
Upgrade quiddity/haecceity to v0.2.8 (
840b2ad). Scene export uses only the
serialise-onlyjsonfeature in native, WASM and Python; no JSON import API is exposed.
Presentation retains text placement, plane/graphic ids, saved views and datum links.
Package schemas match v0.2.8. Written mass units use conversion-based gram per
CAx-IF Annex C.1. Existing Specify STEP goldens remain byte-identical: its material
writer supplies no density and foreign density records are preserved. Recognition stays unchanged. -
Upgrade quiddity/haecceity to v0.2.7 (
eaa7762); recognition stays unchanged.
Writer expectations change for slash-separated deviations and notes/frame placement.
Remove the blank-note drawing workaround: literal blank rows now write valid STEP directly. -
Upgrade quiddity and haecceity to v0.2.6 (
b9addd9, quiddity-rust#137/#135),
including native, WASM and Python. Written STEP now carries dimension and tolerance
callouts, ISO 1302 face surface symbols and aGeneral notesblock for part settings.
Multi-face aspects are composite, locations reference their own aspects, and a datum
feature that also has a size uses separate datum-feature and dimensional-size entities.
Presentation stays enabled; optional F3D import stays off. Recognition schema 6 and
fingerprint format 3 are unchanged.
Kernel note: specify-core-rust uses haecceity tag v0.2.8, quiddity tag v0.2.8; pzfreo/draftwright-rust@v0.2.6 uses haecceity tag v0.2.6, quiddity tag v0.2.6. Different kernels may number STEP faces differently.
specify-core-rust 0.1.4
Added
- For #65: stable per-part characteristic numbers in standard AP242
ID_ATTRIBUTEs,
with a persistent high-water mark that retires removed numbers. PMI/analysis and WASM
snapshots expose file numbers; answer revision carry preserves them through quiddity's
correspondence. General dimensions written as PMI are numbered; rows without an entity remain unnumbered.
A part's first numbering follows inspection order: datum letters, then front/top/right view
and row-major face position, with size/location/control ties; face finishes, threads and
knurls share that walk and unpositioned defaults go last. Later additions append above the
high-water mark. See
characteristic number storage and allocation. - The STEP states every dimension a drawing would (#63): the writer writes the dimensions the
general tolerance covers (plain sizes, plane levels and hole locations,general.rs) with
their nominal alone, under the general tolerance written for the part. A part located by ±
dimensions now carries its hole locations. They are counted in one report line,
N dimensions under the general tolerance. A part with PMI from elsewhere gets none (its
own dimensions stand), and a datum's own faces get no size (its datum stays a plain datum
feature). Read back, Specify's own nominal-only dimensions settle no question.
Fixed
- For #67, revision reports describe an added turned end chamfer with its size and
boss context. Retained supporting surfaces and boundary edges distinguish trimmed
flat centroids from real moving or removal. Raw recognition, correspondence and answer migration are unchanged.
Changed
-
Relicensed from AGPL-3.0-or-later to Apache-2.0 (
LICENSE,NOTICE, both crates'
licensefields), matching quiddity and haecceity. -
Upgrade quiddity and haecceity (native and WASM) to v0.2.5 (
6110b4c,
quiddity-rust#134). Boss heights and free ends include their own convex end chamfers
and rounds; edge-treated plates stay plates, and inside turned fillets are described
as concave. Saved boss answers retain their face targets; revision migration still
reviews changed dimensions. Recognition schema 6 and fingerprint format 3 stay unchanged;
optional F3D import stays off. Plate centre coordinates use the same six-decimal mm
publication as face centroids, keeping native and WASM snapshots consistent after
projected edge strips are restored. -
Upgrade quiddity and haecceity (native and WASM) to v0.2.4 (
2f6b3a6): haecceity's Add
shares the face usages a file's location dimensions hold, so PMI added beside them no longer
breaksitem_identified_representation_usage.UR1(quiddity-rust#132). -
Upgrade quiddity and haecceity (native and WASM) to v0.2.3 (
ced75a5).
Analyses and revision reports describe turned bodies, annular face grooves (rim
diameters, depth and wall angles), cylindrical profile surfaces and concave fillets,
including spherical inside corner caps. These families follow the existing body,
groove and surface rules without additional interview questions or duplicate PMI.
Full-length turned ODs are no longer bosses; their external cylinders retain the
existing OD datum defaults. Saved answers on a removed boss remain
visibly unresolved for review and cannot migrate to another family. Recognition
schema 6 and fingerprint format 3 are unchanged; optional F3D import stays off.
specify-core-rust 0.1.3
Added
specify-core diffcompares two revisions of an assembly with no--part: its parts paired
by name, a parts table of those changed, added, removed, placed a different number of times or
moved, each changed part's own report, and a picture of the whole assembly coloured by part.
Answers are by part name; a single part's answers are taken as its part's when its file
becomes an assembly.--viewer URLlinks each changed part to the /diff page with
&part=NAME. A single part's report is unchanged (docs/diff.md, "Assemblies").- The STEP diff action compares assemblies: one comment with the parts table, a section for each
changed part, the assembly's picture and a /diff link for each changed part.
WASM API
diffcompares two revisions of an assembly part by part:{report, markdown, parts}, each
changed part with its ownmarkdownandview. Its signature is unchanged.