docs(agents): align agent guide with IO policy, MPI smokes, and commit hygiene

The agent entry point now matches current mesh I/O packaging, the expanded
partitioned matvec smoke set, and stricter guidance on reading staged diffs
before every commit.

- Table row for `src/io/` now points at policy README and weakdeps/extensions instead of implying a default Gmsh reader in core
- MPI reference list includes `partitioned_internal_force_smoke.jl` and states CI runs all three under mpiexec
- Zero-alloc invariant bullet cites `test_dof_based_internal_force.jl` for `assemble_internal_force!` / `apply_f_int_owned_rows!`
- New bullet forbids scripted placeholder commits and points to `reset --soft` / `rebase -i` for repair
- Testing section documents `Pkg.test(; test_args=[...])` topic filtering and warns that unknown args fall back to full suite
- Quickstart snippet uses `ContinuumFormulation{ThreeDimensional}()` instead of removed `FullThreeD` alias
This commit is contained in:
Jukka Aho
2026-05-11 02:28:12 +03:00
parent 85900fe680
commit 47e77c2f37
+25 -5
View File
@@ -58,7 +58,7 @@ The authoritative file-organization guide is
| `src/domains/` | Physics kernels per discipline (`continuum/`, `beams/`, `plates/`, …). |
| `src/solvers/` | Linear/nonlinear solvers (still minimal). |
| `src/physics/` | High-level user API (BCs, problems). |
| `src/io/` | Mesh readers (Gmsh by default; Abaqus + Aster live in `Legacy`). |
| `src/io/` | Mesh I/O policy (`README.md`); format-specific readers → weakdeps / extensions or separate packages; Abaqus + Aster remain in `Legacy`. |
| `src/legacy/` | Older pre-reset API (`Problem`/`Assembly`/`Solver`/`Analysis`, Dict-based fields, Abaqus reader, …) wrapped in `module Legacy`; loaded only when `JULIAFEM_ENABLE_LEGACY=1`. |
| `test/<topic>/` | Mirrors `src/<topic>/`. |
| `benchmarks/regression/`, `benchmarks/analysis/` | Timestamped reports. |
@@ -163,8 +163,9 @@ and pass a persistent `mpi_requests` buffer from `allocate_exchange_matvec_halo_
so each matvec does not allocate a fresh `Vector{MPI.Request}`.
Reference drivers: `test/mpi/partitioned_matvec_smoke.jl`,
`test/mpi/partitioned_matvec_cg.jl`. CI runs both under mpiexec (see
`.github/workflows/CI.yml`, job `mpi-partitioned-matvec-smoke`).
`test/mpi/partitioned_matvec_cg.jl`, `test/mpi/partitioned_internal_force_smoke.jl`.
CI runs all three under mpiexec (see `.github/workflows/CI.yml`, job
`mpi-partitioned-matvec-smoke`).
---
@@ -175,7 +176,9 @@ These are non-negotiable. Tests and code analysis enforce them.
1. Zero allocations in hot paths.
`test/assemblers/test_dof_based_zero_alloc.jl` asserts
`@allocated assemble!(...) == 0` and `0` GC allocation sites in the
optimized LLVM IR. Don't introduce `Dict`, `Vector{Any}`, untyped
optimized LLVM IR; `test/assemblers/test_dof_based_internal_force.jl`
does the same for **`assemble_internal_force!`** and
**`apply_f_int_owned_rows!`** on a reference Hex8 patch. Don't introduce `Dict`, `Vector{Any}`, untyped
closures, or `Vector` literals inside loops. For the intended split
between tier 1 numeric kernels (always C-speed, no heap churn in
loops), tier 2 warmed assembly drivers (setup may allocate), and tier 3
@@ -215,6 +218,18 @@ Editor-local Cursor rules under `.cursor/` are not part of the git tree.
large / multi-concern → grouped, substantive bullets). **Propose** paths + full message
and wait for **explicit approval** before each `git commit`. See
`.github/prompts/commit.prompt.md` for the full protocol.
- **AI agents: commits are not a loop variable.** Never drive `git commit` from a
shell or Python loop that stages paths and emits placeholder subjects such as
`update path/to/file.jl` or `sync <module>` derived only from the path. Before
**every** `git commit`, read the **entire** `git diff --staged` yourself (no
`head`, `tail`, `less`, or other truncation when forming the message). The
subject and body must describe the **actual** API and behaviour changes in
those hunks; the optional two-path `.githooks/pre-commit` rule limits batch
size, it does **not** replace reading the diff. If many low-quality commits
already exist locally, repair with `git reset --soft <good_base>` and rebuild
following this file and `.github/prompts/commit.prompt.md`, or use
`git rebase -i` to reword; do not apply a second scripted sweep of generic
messages.
- Never commit without an explicit user command to start committing. Do not
propose or initiate commits unprompted.
- Never create files in the root except for `README*` files.
@@ -225,6 +240,11 @@ Editor-local Cursor rules under `.cursor/` are not part of the git tree.
- Run the full test suite before declaring done.
`julia --project=. -e 'using Pkg; Pkg.test()'`. All bundled topic tests must pass
with no errors (the exact test count grows with the tree under `test/`).
To run a subset, pass topic directory names from `test/runtests.jl` (`TOPICS`), for example
`julia --project=. -e 'using Pkg; Pkg.test(; test_args=["assemblers"])'`.
`test_args` does not accept individual file paths; unknown strings are ignored with a warning
and the full suite runs.
- SPDX tags at file tops must use comment syntax for that file type (for example
`# …` in `.jl`, HTML comments in Markdown); see `docs/CONTRIBUTING.md`.
@@ -257,7 +277,7 @@ The goal is professional engineering documentation, not marketing copy.
elements, handler = create_elements!(mesh, ET)
material = LinearElastic(E=210e9, ν=0.3)
kernel = ContinuumKernel(ContinuumFormulation{FullThreeD}(),
kernel = ContinuumKernel(ContinuumFormulation{ThreeDimensional}(),
material, Displacement{3}())
asm = DOFBasedCOOAssembler() # or COOAssembler()