Drop ScalarDOF/VectorDOF/TensorDOF aliases and canned Lagrange-* constants that
duplicated patterns now expressed via `DOF{Q,E}` and `@DOFSet`.
- Eliminates Vec{1}-based scalar alias layering in favor of explicit quantities.
- Removes unused LagrangeHeat/LagrangeElasticity shorthand blocks tied to old tutorials.
Delete the legacy global numbering implementation that stored DOFs in Dicts and
registered Tuple-shaped field specs at runtime.
- Remove `mutable struct DOFManager` with `node_to_dofs`, `field_specs`, mesh
reference, and incremental `next_dof` counters at odds with type-stable layouts.
- Drop `register_fields!`, `allocate_dofs!`, `count_field_dofs`, mesh-local
entity counters, and `_assign_element_dofs!` variants tied to that storage.
- Remove `create_elements!` / `_build_dof_connectivity` definitions superseded by
`dof_handler.jl` (`DOFHandler`, `_make_element_dofs`, `build_dof_connectivity`).
- Element-set helpers and BC-oriented accessors live on `DOFHandler` now; the
`DOFManager` identifier remains only as the backward-compatible alias.
Clarify that optional bullets become substantive grouped lists when the diff
is large or spans several concerns.
- Adjust the workflow-rules bullet that describes Conventional Commit bodies.
Explain next to the one-file workflow that message depth should follow patch
size—grouped bullets on large or multi-concern commits.
- Adds one bullet under coding rules pointing readers at `.github/prompts/commit.prompt.md`.
Introduce `.github/prompts/commit.prompt.md` as the contributor-facing description
of how assistants should stage, review, propose, and record commits.
- Document defaults: one file per commit, rare justified pairs, no blanket `git add`.
- Describe optional `.githooks/pre-commit` cap at two staged paths.
- Require reading the full `git diff --staged` (no truncation) before messaging.
- Spell out approval-before-commit flow and Conventional Commits subject lines.
- Scale the body to the patch: short summaries for small edits; large or
multi-concern diffs need grouped, substantive bullets so history stays readable.
- Keep checklist items aligned with that depth expectation.
Introduce `DOFHandler{M,S,NF}` with flat `field_starts::NTuple{NF,Vector{Int}}`
per field and entity id, optional `facet_maps` for Edge/Face unknowns, running
`total_dofs`, and a `dof_connectivity` slot populated after element creation.
Reserve `DOFManager` as a backward-compatible alias.
Construction and layout:
- Number DOFs in field-declaration order; within each field walk entities in id
order (nodes, cells, or facet ids) using compile-time `dof_size` widths.
- Auto-build `AbstractFacetConnectivityMaps` for Hex8/Hex20/Tet4/Tet10/Wedge6/Pyr5
when the DOFSet references Edge or Face; error on unsupported mesh/topology pairs.
Mixed-field helpers:
- `global_field_ranges` — contiguous global index ranges per declared field,
checked against `handler.total_dofs`.
- `global_facet_dof` — first global DOF for a Face-owned field given facet gid.
- `saddle_point_blocks` / `saddle_point_matrix_blocks` — named views or CSC
subblocks for two-field `u`/`p`-style matrices using those ranges.
Hot path:
- `@generated _make_element_dofs` emits an `NTuple{N,UInt64}` from handler tables:
Vertex via element connectivity, Cell via element id, Edge/Face via
`elem_edge_gid` / `elem_face_gid`; assert emitted length matches `N`.
- `create_elements!` builds the handler, fills `Vector{Element{K,P,S,N}}`, assigns
DOFs with `_make_element_dofs`, then replaces `handler.dof_connectivity` via
`build_dof_connectivity`. Support `Element{K,P,S}` with inferred `N`, and wrap a
bare single `DOF{Q,E}` into a one-field DOFSet.
Legacy-oriented utilities:
- `get_node_dofs` collects Vertex-field DOFs for one node (allocating helper).
- `get_element_ids` resolves ids from `mesh.element_sets` by name or symbol.