The parity ledger
The committed audit, included verbatim from
docs/PARITY.md.
It is generated from the reference index and the hand-written ledger.
tools/check.sh fails if it goes stale, so this chapter is as current as
the commit the book was built from.
Parity
Generated by tools/parity.py generate; do not edit. The inputs
are docs/parity/reference-index.tsv (generated from the reference tree by
apisurf scope) and docs/parity/parity.toml (hand-written; the only file a
person edits). docs/SCOPE.md defines the target; this file measures
against it.
The primary key here is our capabilities. Each claims the reference headers it answers for; the index is the completeness check. One capability per thing a caller would ask for, not per class and not per package.
Where the audit stands
| verdict | capabilities |
|---|---|
covered | 77 |
partial | 7 |
divergent | 9 |
n/a | 5 |
2704 reference headers in the reviewable pool; 2704 claimed by 98 capabilities, 0 awaiting a claim. Ratchet: unreviewed_max = 0.
Capabilities
ogeom-algo
- algo.bounds: Guaranteed and tight bounding boxes, axis-aligned and oriented, for curves, surfaces and shapes ·
covered· 16 headers claimed - algo.builders: Building topology by hand: vertices, edges, wires, faces, shells, solids ·
covered· 35 headers claimed - algo.classification: Classifying a point against a solid or a face: in, out, or on, exactly ·
covered· 22 headers claimed - algo.curve-sampling: Sampling curves: by count, by spacing, by deflection, by abscissa ·
covered· 14 headers claimed - algo.fitting: Interpolating and approximating points with B-splines, curves and surfaces ·
covered· 82 headers claimed - algo.global-properties: Volume, area, mass, centroid and principal moments of shapes ·
covered· 24 headers claimed - algo.history: Every operation emits history: what was generated, modified, deleted ·
covered· 1 header claimed - algo.medial-axis: The medial axis of a planar region ·
covered· 18 headers claimed - algo.nurbs-conversion: Converting a shape’s geometry to NURBS form ·
covered· 2 headers claimed - algo.place-copy: Copying and transforming shapes, rigidly or generally, sharing what can be shared ·
covered· 10 headers claimed - algo.point-projection: Projecting a point onto a curve or a surface, nearest first, all minima found ·
covered· 26 headers claimed - algo.primitives: The primitive solids: box, wedge, cylinder, cone, sphere, torus, half-space, prism, revolution ·
covered· 23 headers claimed - algo.sewing: Sewing faces into shells along coincident edges, with spatial acceleration ·
covered· 11 headers claimed - algo.shape-distance: Distance, proximity and overlap between whole shapes, and self-intersection ·
covered· 18 headers claimed - algo.solid-from-mesh: A solid from a triangle mesh: coplanar triangles merged into planar faces, curved regions recognized as cylinders, cones, spheres and tori ·
covered· 1 header claimed - algo.spatial-acceleration: Generic bounding-volume hierarchies ·
divergent· 33 headers claimed- reasoning: Acceleration structures here are internal to the algorithms that need them (sewing’s cell filter, the classifier’s bounds, the distance walk’s pruning) rather than a public generic BVH container library. The one consumer that wants a standing BVH over triangles is picking, which is outside the kernel (outside/crates/ogeom-select carries it). If a kernel algorithm ever needs a shared BVH, promoting select’s is the move.
- algo.validity: Diagnosing a shape’s validity, by entity, with named problems ·
covered· 12 headers claimed
ogeom-bool
- bool.booleans: The boolean operations: cut, fuse, common, section and split, exact and fuzzy, with argument checking ·
covered· 99 headers claimed - bool.cells: The cells builder: arbitrary take/remove over the fused arrangement ·
covered· 1 header claimed - bool.defeaturing: Removing a set of faces from a solid by extending and re-intersecting its neighbours ·
partial· 2 headers claimed- restriction: Inner-loop features (bores, bosses, pockets whose rim is a surviving face’s inner wire) remove in full generality: wire surgery, no re-intersection, the block back to the last bit. Band features (fillets and chamfers along an edge) close for any number of bands in one call, each running straight through with two end faces or wrapping with none, and bands meeting at a corner close together: each recovers its own crease, the corner is where one crease pierces the other’s side, and a wedge’s flush cap named with its band folds into the band’s crease; a tangent chain’s bands close together too (a stadium’s rim rounded in one call), the junction being the foot on either crease of the cross-section edge the two bands share, and a band across a circular crease’s seam read as one run about its own centre rather than its complement; a rebuilt face whose surface has no closed-form pcurves fits them by projection, tolerances widened by the measured offset. A rim blend (a drum’s top, a bore’s mouth, a boss’s seat) takes a whole ring out of its neighbours and closes on the circle they meet along: the neighbours’ surfaces tell that wound from a bore’s, whose faces never meet and whose rings are simply dropped, and a neighbour’s own outer boundary may be the ring, so a drum’s cap grows back to its rim. The wall’s seam reaches the recovered circle, which is where it is cut and what the seam extends to meet. Wires are spliced in the face’s own order, since a seam stands in its wire twice, and a gap that leaves and arrives at one vertex is wound the way the rim it replaces was. What stays refused by name: a wound whose sides meet in no curve, a removal that would leave a face with no boundary and no edge to grow to, and a gap the recovered edges do not bridge.
- bool.glue: Gluing shapes along known-coincident boundaries ·
divergent· 1 header claimed- reasoning: Subsumed, and recorded as a settled decision in docs/PLAN.md: the boolean’s same-domain unification already skips nothing it needs and unifies what glue would, so a separate glue mode would be a second spelling of the fuse with a faster wrong answer available. MakeConnected’s job (conformal multi-body assembly) falls out of the fuse plus history.
- bool.make-periodic: Making a shape periodic so instances tile without seam duplication ·
covered· 1 header claimed - bool.make-volume: Making volumes from a soup of faces: the arrangement’s closed cells ·
covered· 1 header claimed
ogeom-core
- core.progress: Cancellable, staged progress through long operations ·
covered· 4 headers claimed - core.tolerances: The tolerance vocabulary: confusion, angular, intersection, and per-entity widening ·
covered· 1 header claimed
ogeom-doc
- doc.appearance: Colours, layers, materials and textures, per shape and per sub-shape, with inheritance resolved ·
covered· 18 headers claimed - doc.application-bootstrap: The OCAF application object the exchange document hangs from ·
n/a· 1 header claimed- reasoning: ogeom-doc is deliberately not a label-and-attribute tree, so there is no framework application to bootstrap; a Document is constructed like any other value. The exchange-document capability itself (XCAFDoc) is in scope and audited separately.
- doc.colour-values: Colour values and their names ·
covered· 4 headers claimed - doc.pmi: Semantic PMI: dimensions, tolerances, datums, datum targets, and their presentation ·
covered· 30 headers claimed - doc.product-structure: Products, occurrences and instances with placements: the assembly tree ·
covered· 14 headers claimed - doc.properties: Names, user properties, validation properties, lengths and centroids to check a transfer by ·
covered· 5 headers claimed - doc.saved-views: Saved views and standalone note objects in the exchange document ·
covered· 10 headers claimed - doc.time-types: Dates and periods ·
n/a· 4 headers claimed- reasoning: Time types are the standard library’s; the one place the exchange layer writes a timestamp it formats a string. A kernel-owned date class would duplicate std::time to no end.
ogeom-fillet
- fillet.bitangent: Bi-tangent blend construction ·
divergent· 4 headers claimed- reasoning: Subsumed, per the settled decision in docs/PLAN.md: the 2D repertoire carries bi-tangency in the plane and the blend family’s own envelope carries it in space, so a separate bi-tangent constructor would be a third spelling of two existing ones.
- fillet.chamfers: Chamfering edges: symmetric, two-distance, distance-and-angle ·
covered· 1 header claimed - fillet.corners-2d: Filleting and chamfering the corners of planar wires ·
covered· 19 headers claimed - fillet.edge-blends: Blending edges: constant and variable radius fillets, rolling-ball, marched where no closed form exists ·
partial· 127 headers claimed- restriction: Single edges, tangent chains and full rims blend, constant and variable radius, and the corner where three blends meet is closed: docs/PLAN.md §B (B2) with §A (A6) behind it. The marched fillet carries the rolling ball to topology on seats no closed form speaks (a fitted seam between two analytic walls, a conic seat re-opened to its full loop), with the blend fitted through the ball’s own arcs and the legs melting on the hosts’ exact surfaces. An open seat runs out: where the crease ends at a wall the band runs on until the ball has left the solid and the cut trims it against the wall; where it ends at a split (a seam vertex, or a neighbouring blend’s own rail), the band is capped in the end section’s own plane, and two such blends meet cap to cap along the shared arc, both caps consumed, in either order. An L-bracket’s end rim blends over its re-entrant band as one tangent chain (line, the band’s own end arc, line), the ball rolling on the concave cylinder between the lines, to the closed form. A fill and a wedge asked together stop at each other, since only blends that round the same way run on through one another’s bands; whichever is asked first takes the corner, and both orders are exact. Cone, sphere and torus hosts march and blend: the chart inverted in closed form, a band’s connector fitted where no closed form lifts the chart segment, a looping seat with a corner at its join steered by a smooth refit of itself, the band’s first station re-solved on the apex column so a rim opened at the host’s own seam leaves no sliver; a full circular rim whose hosts are not a cap and its coaxial wall takes the march too. A fitted host marches: its chart inverts by projection, a closed patch’s seam wraps as a period does, the patch is continued past the face by a few radii so the ball can run out, a seat the boolean split into arcs is closed back through the neighbours the hosts share and marched as the loop it is, the rail loop slid into the host’s own window, and the wedge melts: a straight edge of a converted box, the crease round a converted post split at its seam, a converted cone’s rim, a converted drum’s rim. Under it a marched section the centripetal fit misses is fitted again by chord length, and a loop cut at a closed patch’s seam is closed on it; a melt the boolean still cannot resolve refuses by name. A rim beside a sphere’s pole whose rail passes over the pole blends with the sphere’s leg running from the rail to the pole, the rim cut from it. Owed there: a rail passing within a hair of the pole, and a bore whose wall toward the pole is thinner than the ball. A seat whose hosts turn tangent at an end of the crease (the seam of two equal drums crossing, at the points where they touch) pinches there: the stations are solved one by one toward the pole, the pole’s collapsed section closes the band, and the wedge has no cap at that end. A tangency inside a crease with none at its ends is refused by name. A straight crease whose faces are planes or drums parallel to it (a wall meeting a drum along a ruling) blends exactly: the section swept straight, its band a drum of the fillet’s radius. A vertex where a curved face meets rounds with the one ball touching its three surfaces, its centre walked to a radius in from each and its compartment bounded by the planes through the centre and each pair of touch points, so each band’s end section is the ball’s own;
fillet_edgescloses such a corner, and the bands one at a time with the corner tool after agree with it to rounding when the ruling’s band goes first, or when the rim arc’s band goes first: the straight band’s section through the rim’s torus runs tangent to the torus’s end meridian into the corner, and ends at that vertex. The straight band before the rim arc’s closes too when the ruling’s band follows. Owed: the ruling’s band before the rim arc’s after the straight one, where the rim’s section through the point on top that the cap, the straight band and the torus all touch leaves a stub the corner tool’s cut does not meet. The corner tool rounds any convex planar vertex. Where one ball touches every face (a square or oblique trihedral corner, a square pyramid’s four-edged apex), its block is the polyhedron of the N host planes and the N planes through the ball’s centre square to the edges, where each band’s rim and the ball’s coincide. Where no single ball does (a rectangular pyramid’s apex, an irregular pentagonal one), the region the ball’s centre may occupy has a tip of several vertices joined by ridges, and the corner is the exact envelope of the rolling ball: a sphere at each tip vertex, cut with its own compartment, and the flush fillet of a virtual crease along each ridge, the compartments meeting cap to cap on the planes square to the ridges; a ridge seven microns long is kept as the sliver of cylinder it is. At more than three edges the corner goes first and the flush fillets follow, since bands built before the corner crash into each other at the apex. The ball’s pole stands along a ridge where there is one, its seam turned from the corner, and otherwise the tool is offered on each of the corner’s 2N labellings in turn, the first that closes standing; the boolean closes every labelling of an oblique corner and of a square pyramid’s apex, one solid each time. The flush fillets follow at a sharp apex too, and after a corner whose sphere clears a fourth plane by a few hundredths of a millimetre, where the envelope keeps a sliver of that plane beside the patch and the band meeting the sliver runs a straight end tangent to the sphere’s rim: a line and a circle share no stretch, so the tangency splits neither. The curved-seat corner is closed in either order: throughfillet_edgesa marched blend and a straight one meet at their corners, the later’s run-out walking on under the earlier band, and the boolean decides once per shared edge piece whether it is dust. A sub-piece of one edge lies in several charts, each with its own snap, so deciding once means a sliver that one chart collapses is collapsed in every chart. Where three or more edges of onefillet_edgescall meet at a vertex, the corner tool closes it with the rolling ball’s patch before the bands, which stop flush against it: a box corner’s sphere octant, a pyramid apex’s sphere or spheres and cylinders; a corner the tool does not speak keeps the bands’ caps.
- restriction: Single edges, tangent chains and full rims blend, constant and variable radius, and the corner where three blends meet is closed: docs/PLAN.md §B (B2) with §A (A6) behind it. The marched fillet carries the rolling ball to topology on seats no closed form speaks (a fitted seam between two analytic walls, a conic seat re-opened to its full loop), with the blend fitted through the ball’s own arcs and the legs melting on the hosts’ exact surfaces. An open seat runs out: where the crease ends at a wall the band runs on until the ball has left the solid and the cut trims it against the wall; where it ends at a split (a seam vertex, or a neighbouring blend’s own rail), the band is capped in the end section’s own plane, and two such blends meet cap to cap along the shared arc, both caps consumed, in either order. An L-bracket’s end rim blends over its re-entrant band as one tangent chain (line, the band’s own end arc, line), the ball rolling on the concave cylinder between the lines, to the closed form. A fill and a wedge asked together stop at each other, since only blends that round the same way run on through one another’s bands; whichever is asked first takes the corner, and both orders are exact. Cone, sphere and torus hosts march and blend: the chart inverted in closed form, a band’s connector fitted where no closed form lifts the chart segment, a looping seat with a corner at its join steered by a smooth refit of itself, the band’s first station re-solved on the apex column so a rim opened at the host’s own seam leaves no sliver; a full circular rim whose hosts are not a cap and its coaxial wall takes the march too. A fitted host marches: its chart inverts by projection, a closed patch’s seam wraps as a period does, the patch is continued past the face by a few radii so the ball can run out, a seat the boolean split into arcs is closed back through the neighbours the hosts share and marched as the loop it is, the rail loop slid into the host’s own window, and the wedge melts: a straight edge of a converted box, the crease round a converted post split at its seam, a converted cone’s rim, a converted drum’s rim. Under it a marched section the centripetal fit misses is fitted again by chord length, and a loop cut at a closed patch’s seam is closed on it; a melt the boolean still cannot resolve refuses by name. A rim beside a sphere’s pole whose rail passes over the pole blends with the sphere’s leg running from the rail to the pole, the rim cut from it. Owed there: a rail passing within a hair of the pole, and a bore whose wall toward the pole is thinner than the ball. A seat whose hosts turn tangent at an end of the crease (the seam of two equal drums crossing, at the points where they touch) pinches there: the stations are solved one by one toward the pole, the pole’s collapsed section closes the band, and the wedge has no cap at that end. A tangency inside a crease with none at its ends is refused by name. A straight crease whose faces are planes or drums parallel to it (a wall meeting a drum along a ruling) blends exactly: the section swept straight, its band a drum of the fillet’s radius. A vertex where a curved face meets rounds with the one ball touching its three surfaces, its centre walked to a radius in from each and its compartment bounded by the planes through the centre and each pair of touch points, so each band’s end section is the ball’s own;
- fillet.osculating-cache: Cached osculating surfaces along a blend’s tangency curves ·
divergent· 1 header claimed- reasoning: An implementation detail of the reference’s blend pipeline: it caches osculating approximations to march against. The marching blend here solves the ball’s two contact points directly at each section (ogeom-fillet’s march module), so there is no cache to keep coherent.
ogeom-geom
- geom.adaptors: Evaluating topology as geometry: an edge’s curve and a face’s surface, placed ·
covered· 22 headers claimed - geom.conversion: Converting between curve and surface forms: to B-spline, to Bézier segments, degree elevation ·
covered· 40 headers claimed - geom.curves-2d: Parametric plane curves, the pcurve vocabulary ·
covered· 18 headers claimed - geom.curves-3d: Parametric space curves: lines, conics, Bézier, B-spline, trimmed, offset ·
covered· 21 headers claimed - geom.extension: Extending curves and surfaces beyond their domains ·
covered· 13 headers claimed - geom.handle-wrappers: Geometry-layer wrappers for points, vectors, placements and transforms ·
divergent· 16 headers claimed- reasoning: The reference wraps every gp value in a reference-counted handle class so geometry can sit in documents. Here geometry lives in shared arenas keyed by id (docs/DATA_MODEL.md), and points, vectors and placements are plain values. A second, handle-shaped copy of the gp vocabulary would exist only to be a different allocation discipline. The capability those wrappers deliver is the arena’s.
- geom.local-properties: Local properties along curves and across surfaces: tangent, normal, curvature ·
covered· 30 headers claimed - geom.surfaces: Parametric surfaces: planes, quadrics, swept, Bézier, B-spline, trimmed, offset ·
covered· 26 headers claimed
ogeom-heal
- heal.canonical-simplification: Recognizing that exact geometry is secretly analytic: a B-spline that is a cylinder ·
covered· 1 header claimed - heal.custom-remodelling: Rebuilding a shape’s geometry wholesale: baking transforms, converting representations ·
covered· 12 headers claimed - heal.fix-shape: Fixing broken shapes: wires, faces, shells, solids, free bounds, small features ·
partial· 35 headers claimed- restriction:
fix_shapeis the standalone entry point: diagnose, put a wire’s edges end to end where an order exists, collapse edges shorter than their own vertices’ tolerances, fit missing pcurves, sew loose faces, tighten tolerances, restore tolerance containment by widening what is bounded (restore_containment, which the STEP and IGES readers run on every body they build), diagnose again, and report what it did and what remains. Beneath it: reanchoring periodic rings, sewing, validity diagnosis, the reader’s inline heal sequence, and the instructed fixes: fix_face_pcurves fits the trims the reader refused at a caller’s cap, and reanchor_boundaries moves a boundary onto the surface it bounds with the displacement recorded in widened tolerances, both measured on community assemblies with boundaries millimetres off. fix_small_faces collapses a spot face to a point and a strip face to one long side, rebuilding its neighbours so the shell stays closed; remove_small_solids drops debris solids under a volume. A STEP grid of patches reads as one spline surface. Healing here is measured by the imported corpus rather than claimed in general.
- restriction:
- heal.same-parameter: Diagnosing and repairing the same-parameter law between a curve and its pcurves ·
covered· 26 headers claimed - heal.scripted-pipeline: Resource-file-driven sequences of healing operators ·
divergent· 11 headers claimed- reasoning: The job (run a heal sequence on import) exists and is done with a fixed inline sequence in the exchange readers, measured by the corpus. A pipeline scripted from resource files is configuration the applications that need it can build from the same functions; the kernel keeping a config-file interpreter would be an application affordance.
- heal.status-reporting: Statuses, messages and traversal support for the healing pipeline ·
divergent· 7 headers claimed- reasoning: Healing outcomes here are values:
SameParameterReport,StepReport, counts fromreduce_tolerances. These are Rust Results rather than status bitfields read back through a registrator. A message-registration framework would add a second channel for what the return values already say.
- reasoning: Healing outcomes here are values:
- heal.substitution: Recording shape substitutions and applying them across a model ·
covered· 6 headers claimed - heal.tolerances: Reading and tightening the tolerances a shape actually needs ·
covered· 2 headers claimed - heal.upgrade: Upgrading shapes in place: same-domain unification, edge merging, subdivision ·
covered· 34 headers claimed
ogeom-hlr
- hlr.projection: Projecting a model into a view with visibility classified: hidden line removal, exact and polygonal ·
covered· 77 headers claimed
ogeom-intersect
- intersect.analytic-sections: Closed-form intersections of planes and quadrics ·
covered· 8 headers claimed - intersect.curve-curve: Intersecting two curves, in the plane and in space: crossings, tangencies, overlaps ·
covered· 26 headers claimed - intersect.curve-surface: Intersecting a curve with a surface: piercings and lying segments, with transitions ·
covered· 7 headers claimed - intersect.extrema: Extrema between two curves, a curve and a surface, or two surfaces ·
covered· 28 headers claimed - intersect.surface-surface-march: The general surface/surface intersection: seeding, marching, branch assembly, approximation ·
covered· 82 headers claimed
ogeom-io
- io.exchange-framework: The exchange session framework: interface models, transfer processes, selections, work sessions ·
divergent· 215 headers claimed- reasoning: The reference decouples file model from transfer through a session framework (Interface models, Transfer processes and actors, IFSelect work sessions), largely so many formats and an interactive shell can share one machinery. Readers here parse the file model and build the document directly; what a session would report lives in the returned reports, and there is no interactive shell to serve. The capability the framework delivers to an application (read the file, know what happened) is the readers’ contract.
- io.iges: IGES, both directions: solids as manifold B-rep, surface files sewn, units converted ·
partial· 128 headers claimed- restriction: The core entity set reads and writes (30 entity types, the
figure
tools/parity.py exchangeregenerates from the module’s own table), and eight round-trip cases hold it to measured volumes: planes, a periodic cylinder wall with its seam, a doubly periodic torus, a seam-only sphere, a boolean result, a spline-walled prism through 126/128, and inch-unit scaling. The reader also takes every axis-aligned conic arc (104: ellipse, hyperbola, parabola, each as its own curve), ruled surfaces (118) as the degree-one patch between the two curves’ exact spline forms, and constant offset curves and offset surfaces (130, 140). A conic whose axes turn is read in the frame where its cross term vanishes and turned back, exactly; parametric spline surfaces (114) convert exactly to bicubic B-splines; an offset curve whose distance varies (linearly with arc length, or as a function curve’s coordinate) is fitted same-parameter with its base; and a trim given only in a B-spline surface’s parameters is lifted through the surface. Model-space annotation (notes, leaders, labels, symbols and the linear, radial, diametral, angular and ordinate dimensions) reads as PMI callouts of the lines the file draws, a dimension whose text states a number carrying that value as a semantic dimension. Subfigure instances (408) place their definition (308), built once and shared under each instance’s placement, translation and scale; levels (with 406 level lists) and groups (402) read as the document’s layers. Constructive solids read as the solids they describe: the block, wedge, cylinder, cone frustum, sphere, torus and ellipsoid primitives (150 to 168), solids of revolution and linear extrusion, boolean trees (180) through the kernel’s own booleans, solid assemblies (184) and solid instances (430). A trim given only in the parameters of a plane, cylinder, cone, sphere or torus is lifted through the format’s parameterization, each surface framed by the reference direction it names; on a tabulated cylinder (fractions of its directrix and generator) and a surface of revolution whose generatrix is a line or a spline (the generatrix’s own parameter and the angle turned). Refused by name: a trim on a surface of revolution of another generatrix, whose own IGES parameter this reader does not carry; a drawing’s own annotation stays on the sheet and is counted as skipped.
- restriction: The core entity set reads and writes (30 entity types, the
figure
- io.mesh-formats: The mesh exchange formats: STL, OBJ, PLY, glTF/GLB, 3MF, with welding on import ·
covered· 69 headers claimed - io.native-format: The native shape interchange format, versioned, with location and triangulation sets ·
covered· 24 headers claimed - io.step: STEP, both directions: shapes, assemblies, colours, validation properties, semantic and presentation PMI ·
covered· 211 headers claimed - io.vrml: VRML scenes ·
covered· 102 headers claimed
ogeom-math
- math.analytic-carriers: The analytic curve and surface carriers: lines, conics, quadrics ·
covered· 15 headers claimed - math.bspline-basis: The B-spline basis: knots, evaluation, derivatives, insertion, elevation, splitting ·
covered· 14 headers claimed - math.curve-constructors: Constructing curves from constraints: through points, from centre and radius, trimmed arcs ·
covered· 59 headers claimed - math.elementary-evaluation: Evaluating and parameterizing the elementary curves and surfaces in closed form ·
covered· 2 headers claimed - math.equation-solving: Roots and minima of functions and systems: Newton, Brent, bisection, polynomial roots, global minima ·
covered· 31 headers claimed - math.expressions: A symbolic expression interpreter ·
n/a· 68 headers claimed- reasoning: A symbolic algebra layer serves parametric applications (dimension formulas, feature trees), not the geometry kernel; nothing in the modelling pipeline evaluates an expression tree. An application wanting formulas brings its own interpreter, as the consumers surveyed do.
- math.linear-algebra: Dense and sparse linear systems, least squares, eigenvalues ·
divergent· 16 headers claimed- reasoning: Dense linear algebra is nalgebra’s, on purpose: the workspace is generic over RealField so extended-precision scalars can be swapped in (docs/DATA_MODEL.md), and reimplementing SVD/LU under that constraint buys nothing but bugs. What is ours is what the reference lacks a direct twin for: the sparse matrix and conjugate-gradient path the fitting pipeline uses (ogeom_math::SparseMatrix, ogeom_math::least_squares_cgnr).
- math.primitives: Points, vectors, directions and frames, in the plane and in space ·
covered· 17 headers claimed - math.quadrature: Numerical integration ·
covered· 7 headers claimed - math.tangency-constructions: 2D tangency constructions: circles and lines tangent to points, lines and circles ·
covered· 58 headers claimed - math.transforms: Rigid and general transforms, quaternions, and their interpolation ·
covered· 12 headers claimed
ogeom-mesh
- mesh.editing: Editing triangulations: connectivity, welding, decimation, boundary loops ·
covered· 8 headers claimed - mesh.hatching: Hatching faces: iso and free-direction line families clipped to the trim ·
covered· 20 headers claimed - mesh.shape-wrapping: Wrapping triangulations and point clouds as shapes ·
n/a· 3 headers claimed- reasoning: Faces whose geometry is a triangle set, point-cloud stand-ins and preview boxes exist to feed viewers progressively; a viewer consumes the triangulation directly here. A solid built on a mesh, its surfaces recognized, is algo.solid-from-mesh.
- mesh.tessellation: Triangulating shapes to a stated deflection, deterministically, in parallel ·
covered· 91 headers claimed
ogeom-offset
- offset.draft: Drafting faces about a neutral plane for mould release ·
partial· 8 headers claimed- restriction: Planar faces turn about their neutral line, walls of revolution (cylinders and cones) turn about their neutral circle into exact cones, and extruded walls (a spline profile swept straight) turn ruling by ruling about their neutral crossing’s own tangent and re-fit, with the drafted angle held along the height. Every other face (a raw fitted patch, a wall of revolution about an oblique neutral) is drafted the way a mould-maker drafts: the ruled surface through the face’s crossing with the neutral plane, rulings the pull turned by the angle, read off the face’s own mesh and corrected onto the surface. A draft whose turned rulings cross inside the drafted window (a profile curled tighter than the draft’s reach) is refused by name, as is a face the neutral plane crosses twice or not at all.
- offset.filling: Filling a boundary with a face: the plate surface ·
covered· 32 headers claimed - offset.form-features: The form features: prism, revolution, rib and slot against a base ·
covered· 39 headers claimed - offset.loft: Lofting through sections, ruled or smoothed ·
partial· 1 header claimed- restriction: The ruled loft takes two closed wire sections (coaxial parallel circles, or polygons of the same corner count whose ruled walls come out planar) or a section and a point: a cone on a circle’s own axis, an exact pyramid over any straight loop. The skinned loft takes N closed sections, planar or not (a planar end is capped by its plane, a wavy end by a patch skinned from the rim to a point inside it), ends at a point on request, loops back on itself, and takes per-section alignment hints. A ruled wall between two segments that are not coplanar is the bilinear patch through its four corners, exact, so polygon sections may be turned against each other; mixed edge counts are authorship, not geometry, and stay with the skinned resampling. The skinned loft holds its sections exactly where they are exact: through two sections it is the ruled loft; through more with matching corners, one strip per edge meeting along seams through the corners, a plane wherever its rows share one; through coaxial circles, the revolution of a meridian through their radii.
- offset.middle-path: Extracting the middle path of a pipe-like solid ·
covered· 1 header claimed - offset.projection: Projecting wires normally onto faces, pcurves riding along ·
covered· 2 headers claimed - offset.shell-thicken: Offsetting shapes and thickening shells into solids ·
covered· 16 headers claimed - offset.sweeps: Sweeping profiles along spines: pipes, pipe shells, evolved shapes, the frame laws ·
partial· 120 headers claimed- restriction: Pipes run a circular section along a single spine edge, exactly for straight and circular spines and skinned for free-form and helical ones. The evolved sweep runs a profile along a planar spine, exactly, by composition. The pipe shell sweeps an arbitrary planar profile, holes and all, along an open spine wire under a rotation-minimizing or Frenet frame law, and it also sweeps a profile round a closed spine, smooth or faceted, holes and all: the loop’s holonomy paid off, a faceted profile skinned as one C1-closed strip per facet, each hole a void tunnel of its own shell. A sharp-cornered ring mitres exactly when its corners turn in the plane: the wrap is one more mitre, the seam must stand on a corner, and the planar Pappus volumes land to the last digit. The Frenet law rides the loop too (single-valued round it, so it owes no reconciliation), with every corner loop one rail shared by the two strips meeting there. A ring seamed mid-leg butts its two half-legs on the seam’s own ring, and a skew-cornered ring closes on its mitres: the frame is reflected across each mitre plane, the loop’s holonomy spread along the legs as a twist. A corner against a curved leg, on an open spine or a ring, ends both walls on the crossing of their generators, exact where the corner turns in the leg’s plane. A skew corner against a curved leg keeps the reflected frame and mitres in pieces: each side is swept on straight past the corner, trimmed by the mitre plane, and the pieces fused, the difference between the two sections standing as a face of the mitre plane; a closed wire profile sweeps there as the walls of the face it bounds, the end caps taken off. Each spine edge skins its own run, so a spine whose curvature steps at a smooth join (an arc into its tangent line) is followed exactly, and a run whose sections share a plane is that plane. A spine of lines and arcs meeting tangent is swept exactly: each line leg an extrusion of the section, each arc leg its revolution about the arc’s axis, the legs fused, so every wall is the plane, drum, cone, ball or torus its profile edge sweeps.
make_helical_sweepis the screw motion of a profile in a plane through the axis, cylindrical or tapered, either hand: every point runs its own helix and the walls are fitted through those images in quarter turns.
- restriction: Pipes run a circular section along a single spine edge, exactly for straight and circular spines and skinned for free-form and helical ones. The evolved sweep runs a profile along a planar spine, exactly, by composition. The pipe shell sweeps an arbitrary planar profile, holes and all, along an open spine wire under a rotation-minimizing or Frenet frame law, and it also sweeps a profile round a closed spine, smooth or faceted, holes and all: the loop’s holonomy paid off, a faceted profile skinned as one C1-closed strip per facet, each hole a void tunnel of its own shell. A sharp-cornered ring mitres exactly when its corners turn in the plane: the wrap is one more mitre, the seam must stand on a corner, and the planar Pappus volumes land to the last digit. The Frenet law rides the loop too (single-valued round it, so it owes no reconciliation), with every corner loop one rail shared by the two strips meeting there. A ring seamed mid-leg butts its two half-legs on the seam’s own ring, and a skew-cornered ring closes on its mitres: the frame is reflected across each mitre plane, the loop’s holonomy spread along the legs as a twist. A corner against a curved leg, on an open spine or a ring, ends both walls on the crossing of their generators, exact where the corner turns in the leg’s plane. A skew corner against a curved leg keeps the reflected frame and mitres in pieces: each side is swept on straight past the corner, trimmed by the mitre plane, and the pieces fused, the difference between the two sections standing as a face of the mitre plane; a closed wire profile sweeps there as the walls of the face it bounds, the end caps taken off. Each spine edge skins its own run, so a spine whose curvature steps at a smooth join (an arc into its tangent line) is followed exactly, and a run whose sections share a plane is that plane. A spine of lines and arcs meeting tangent is swept exactly: each line leg an extrusion of the section, each arc leg its revolution about the arc’s axis, the legs fused, so every wall is the plane, drum, cone, ball or torus its profile edge sweeps.
- offset.wire-offset: Offsetting planar wires, with the join styles ·
covered· 1 header claimed
ogeom-topo
- topo.data-model: The B-rep data model: shapes as (node, location, orientation) handles into shared arenas ·
covered· 36 headers claimed - topo.identity: The same / equal / partner identity trichotomy, each with a matching hasher ·
covered· 2 headers claimed - topo.location-chain: Placement as a chain of transforms, so instancing shares geometry ·
covered· 4 headers claimed - topo.multi-representation-edges: Edges and vertices carrying several representations: space curve, pcurves per face, polygons on triangulations ·
covered· 16 headers claimed - topo.shared-state-locking: Mutex provision for shapes shared across threads ·
n/a· 1 header claimed- reasoning: Exclusive access is the borrow checker’s job: mutation needs
&mut Model, which is the lock, held at compile time. A class that hands out mutexes per shape has no counterpart because the failure it guards against does not compile here.
- reasoning: Exclusive access is the borrow checker’s job: mutation needs
- topo.traversal: Exploring a shape: filtered descent, unique enumeration, ancestry maps ·
covered· 3 headers claimed - topo.triangulation-store: Triangulations as first-class model data: triangles, polygons on them, parameters ·
covered· 8 headers claimed
Exchange entities (collapsed)
One row per entity package; the coverage figures regenerate from the
entity tables in ogeom-io and are audited in tranche 3, not per
header.
| rule | package | headers |
|---|---|---|
| C-IGES | IGESAppli | 49 |
| C-IGES | IGESBasic | 46 |
| C-IGES | IGESDefs | 22 |
| C-IGES | IGESDimen | 55 |
| C-IGES | IGESDraw | 37 |
| C-IGES | IGESGeom | 57 |
| C-IGES | IGESGraph | 39 |
| C-IGES | IGESSolid | 62 |
| C-STEP | RWStepAP203 | 11 |
| C-STEP | RWStepAP214 | 29 |
| C-STEP | RWStepAP242 | 4 |
| C-STEP | RWStepBasic | 117 |
| C-STEP | RWStepDimTol | 49 |
| C-STEP | RWStepElement | 15 |
| C-STEP | RWStepFEA | 52 |
| C-STEP | RWStepGeom | 83 |
| C-STEP | RWStepKinematics | 74 |
| C-STEP | RWStepRepr | 67 |
| C-STEP | RWStepShape | 91 |
| C-STEP | RWStepVisual | 97 |
| C-STEP | StepAP203 | 41 |
| C-STEP | StepAP209 | 1 |
| C-STEP | StepAP214 | 80 |
| C-STEP | StepAP242 | 6 |
| C-STEP | StepBasic | 166 |
| C-STEP | StepDimTol | 76 |
| C-STEP | StepElement | 67 |
| C-STEP | StepFEA | 87 |
| C-STEP | StepGeom | 115 |
| C-STEP | StepKinematics | 86 |
| C-STEP | StepRepr | 94 |
| C-STEP | StepShape | 127 |
| C-STEP | StepVisual | 177 |
Dropped headers, and on whose authority
Regenerate the full list with apisurf scope; sample it with
--sample N. A dispute with a rule is a change to apisurf.py, and
shows up as a diff naming exactly which headers moved.
| rule | headers | justification |
|---|---|---|
| R1 | 643 | CDL generic instantiations: container words, The-/My- internals, chained Ofs. Rust generics express every one of these without a named type per instantiation; there is no capability to audit. |
| R2 | 237 | The dedicated container packages (NCollection, TCol*, TCollection, TShort). Same ground as R1, package-shaped. |
| R3 | 236 | Operating-system and infrastructure surface: memory, threads, signals, streams, strings, resources, persistence plumbing. The standard library’s job. Cancellable progress is carved out and sits in the keep pool (V-PROGRESS). |
| R4 | 242 | The TopOpeBRep* boolean family, superseded inside the reference by the BOPAlgo pipeline. Compatibility residue is not parity. |
| R5 | 36 | OCAF persistence drivers inside DataExchange. The exchange document is in scope; the framework’s serialization of it is not. |