Skip to content

Rolling development → main - #258

Draft
domattioli wants to merge 63 commits into
mainfrom
development
Draft

Rolling development → main#258
domattioli wants to merge 63 commits into
mainfrom
development

Conversation

@domattioli

@domattioli domattioli commented Jul 15, 2026

Copy link
Copy Markdown
Owner

Latest session (2026-09-02 — operator-directed dev-cleanup follow-ups: #266 gmsh validation helper + #263 hardcoded /tmp)

Prior session (2026-07-27 hour-14 rotation — project_plan.md staleness banner (#261) + #201 flipped to needs-operator)

Prior session (2026-07-26 hour-14 rotation — #256 Phase 2 release-gated publish-cpp-wheels.yml shipped)

Prior session (2026-07-25 hour-14 rotation — #256 Phase 1a real full_init CI smoke shipped)

  • Shipped (811110f) — CIBW_TEST_COMMAND now executes chilmesh_cpp.full_init on a 2-triangle unit square and asserts 4 verts / 2 elems / 5 edges / adjacency_built / n_layers >= 1.

Prior session (2026-07-24 hour-14 rotation — #223 medial-rule research.md, CONCEPTS.md contradiction surfaced)

Prior session (2026-07-23 hour-14 rotation — #250 Rust ENPAC2003 cells filled)

Prior session (2026-07-22 hour-14 rotation — #257 downstream-rename audit closed + #197 size-blindness note)

Prior session (2026-07-21 hour-14 rotation) — v1.4.0 #187 breaking-rename migration section in docs/DOWNSTREAM_MIGRATION_GUIDE.md (7768cb4).

Prior session (2026-07-20 hour-14 rotation) — CITATION.cff affiliation → Unaffiliated (a4de4dd, closes #247).

Prior session (2026-07-19 hour-14 rotation) — fort.14 boundaries_present presence flag (11e2a49, closes #259).

Prior session (2026-07-18 hour-14 rotation) — quad min_angle/max_angle correctness fix (183652f, closes #260); fast suite 1484 passed.

Prior session (2026-07-16 hour-14 rotation) — .grd summary reroute regression guard (db6f290).

Prior session (2026-07-15 hour-14 rotation) — .domi-pin sync c430fc2 (adbcbb8); #257 audit.

Notes / reconciliation (operator)

  • main carries 4 commits not on development (94b4e08 CFF 1.4.1, 28be8b7/806e092 Zenodo DOI + README link, and the Rolling development → main #254 merge). They overlap development's own Zenodo-DOI doc commit (2bfb838) → reconcile at promotion.
  • Carried-over unmerged doc work: 769bcdc README roadmap refresh; 9735003/2bfb838 MATLAB-bridge + Zenodo badge docs.

Rolling development → main staging PR (prior rolling PR #254 merged an earlier development snapshot f1444b6; this re-opens the promotion lane). Accumulates AI-routine + maintenance work for operator review before promotion.

🤖 Generated with Claude Code

[model: claude-fable-5-1, repo: CHILmesh, session: 2026-09-02-dev-cleanup, effort: med]

domattioli and others added 30 commits July 10, 2026 13:46
read_fort14_raw gains parse_boundaries: bool = True. With False it returns
after the node/element table (empty boundaries), so identity consumers that
keep their own boundary parser (Valence #214) avoid the boundary-block parse
that raises on `=`-prose NOPE/NBOU headers in 10 of the 41 corpus meshes.

Element vertex tokens now parse via int(float(v)), tolerating float-formatted
integer indices (`1.000000`) present in structuredMesh1-4.

Default behavior unchanged (back-compat). Corpus table-only reads: 27/41 -> 41/41.
Unblocks Valence fort.14 read delegation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XoyeVJQshr8dMi41Pk2Rbm
Extend the int(float()) leniency from element vertices (prior commit) to the
NE/NP header counts and the node-id / element-id / arity columns, so a fort.14
written with uniform float formatting (`1.000000 0.0 0.0 1.0`) parses. Covers
Valence's float_ids.14 fixture end-to-end, letting the Valence adapter drop its
own file-normalizing fallback. Corpus table-only stays 43/43; ids are integers
so int(float(tok)) is exact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XoyeVJQshr8dMi41Pk2Rbm
#251)

smooth_mesh declared *kwargs (single star) → collected extra positional
args and forwarded positionally; keyword smoother options (n_iter, omega,
freeze_quad_nodes) raised TypeError. Change to keyword-only sdf/size_fn +
**kwargs; forward as direct_smoother(**kwargs)/angle_based_smoother(**kwargs).
Add TestSmoothMeshKwargPassthrough regression (2 cases).
…d boundary blocks (#253)

Default-mode read_fort14_raw raised Fort14ParseError on 10/41 Valence corpus
meshes: int(parts[1]) choked on '='-prose ibtype tokens, and declared
boundary counts exceeding the block hit IndexError (Baranja_Hill, donut).
Add _lead_int() helper (leading-integer extraction, ignore trailing prose)
for ibtype parsing; guard both boundary loops + node loops against EOF
overrun. Add 2 regression tests.
…ce (#241)

New additive module src/chilmesh/geometry.py mirroring quality.py raw-array
style: haversine_m (vectorized, metres, mean-Earth-radius, clamped asin) and
edge_lengths(p1, p2, crs='cartesian'|'spherical') — planar Euclidean in
native units or geodesic metres for lon/lat degrees. CRS caller-declared;
resolvable from fort.15 ICS (Fort15.ics). Exported at package level.
15 tests (equator degree, antipodal clamp, 3-4-5, vectorized, error paths,
import surface). Upstreamed from Valence per #241.
…distance (#240)

Five pure-numpy primitives appended to geometry.py (no new deps):
convex_hull (Andrew's monotone chain, CCW, collinear-dropped),
is_antimeridian_wrapping / split_antimeridian_bbox (dateline-aware bbox
handling), bbox_iou (antimeridian-aware via east/west split), and
hausdorff_distance (discrete symmetric, cartesian or spherical/haversine).
Package-level exports. 27 new tests (40 total in test_geometry.py).
Upstreamed from Valence per #240.
Add courant_number(points, edges, depths, dt, crs) — per-edge shallow-water
Courant C = sqrt(g*h)*dt/dx (h = deeper endpoint depth, dx from geometry
edge_lengths honouring cartesian/spherical CRS); NaN for dry (h<=0) or
degenerate (dx<=0) edges. Add cfl_gate(...) wrapper: pass/fail flag vs
courant_max with max/median/p95 stats + worst-offender list. Both raw-array
(numpy-only), exported at package level, mirroring element_quality style.
19 new tests. Upstreamed from Valence gates.py per #238.
…ize reserved for medial-axis

Operator-ratified 2026-07-10 (math frame: stored ring = discrete level set;
construction = onion peeling; front-collision locus = medial axis, distinct).

Renames (clean, no compat aliases — no consumers yet):
- _layerize -> _peel (private port of MATLAB meshLayers)
- new public peel_layers() -> returns self.layers
- reskeletonize_local -> repeel_local; skeletonize_diff -> layers_diff
- _skeletonize alias deleted; all call sites -> _peel()
- 7 test files renamed (skeletoniz*/reskeletonize -> peel/repeel)
- prose sweep: 'skeletonization' -> 'peel/layer peel' across src, tests,
  scripts, docs (ARCHITECTURE, BENCHMARK, CONCEPTS, LEXICON_PROPOSAL)
- LEXICON_PROPOSAL.md rewritten as ratified decision record (caveman)

Reserved: 'skeletonize' now appears in code only as the compiled cpp/rust
backend extension API method (cross-language rename = backend release cycle)
and historical doc references. Future medial-axis op (#223) owns the name.

Verified: full fast suite 1423 passed / 79 skipped.
…, hero rework

- CHANGELOG: retitle shipped-but-unreleased [Unreleased] block as [1.3.0]
  (2026-07-04); add [2.0.0] section (breaking #187 lexicon renames +
  smooth_mesh signature fix; geometry module; CFL gate; fort14 robustness).
- pyproject 1.3.1 -> 2.0.0 (breaking renames, no compat aliases).
- CITATION.cff version 2.0.0, date-released 2026-07-10.
- README: sweep to ratified lexicon (peel/peel_layers; layerize retired);
  hero alt text updated to the new sequence.
- generate_hero_animation.py: rewritten schedule per operator + #198 —
  peel_layers reveal (input) -> quality crossfade -> ADMESH truss morph
  (positions+quality interpolated) -> FEM morph -> peel_layers reveal
  (smoothed), looping layers-to-layers. New facecolor blend/reveal helpers;
  render_view replaces render_frame.
…ted truss & FEM (#198)

New sequence: peel_layers() inward reveal on the input mesh -> element
quality crossfade -> ADMESH truss (node positions + quality interpolated
to convergence, #198) -> FEM smoother (interpolated) -> peel_layers()
reveal on the smoothed mesh, looping layers-to-layers. Quality histogram
visibly improves raw (median 0.491) -> smoothed (0.669).
…FEM/peel animation (#179)

distmesh2d_warmstart gains additive history_out=/history_every= per-iteration
snapshot capture ((points, triangulation) post-update; default off, no
behavior change; 2 regression tests incl. determinism vs no-capture run).

Hero animation rebuilt on real pipeline states only:
- Stage 0 Seed: boundary rings fade in, random interior nodes fall onto the
  paper (staggered), settle pause, wireframe of the scattered triangulation.
- Stage 1 Truss: playback of ACTUAL solver iterations at deltat=0.02 (the
  converging regime for a cold scattered seed — median q 0.38 -> 0.87 in ~15
  iterations; default deltat oscillates), early frames held 3x (slow-motion
  replay of real states), retriangulations included.
- Stage 2 FEM: Balendran smoother on the solver's real output mesh.
- Stage 3 Peel: held final peel_layers() view (no reveal frames).
Histogram y-axis pinned to global max bin count. 24.3 s loop.
…DME renders it

README displays the hero at width=720; the 1320px render was wasted bytes
and tripped GitHub's README image pipeline (raw path serves fine, client
render failed). Same animation, smaller payload.
…t kwargs, equal-motion pacing, peel reveal, size budget)
…provenance, real CHILmesh guard, 18f holds, T026/T027
read_fort15(deep=True) additionally parses NOLIBF..REFTIM (incl. NWP
nodal-attribute names, TAU0==-5 min/max branch, 3D IDEN skip) into new
Optional Fort15 fields. Best-effort: parse failure warns and leaves deep
fields None. raw_text + byte-preserving write_fort15 contract unchanged
(#201). Unblocks Valence CFL/completeness-gate field needs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NV4fDaJG9iDB12CV1nmgBm
Was pinned to startswith('1.'); package is 2.0.0 since the v2.0.0 prep
commit, so the assertion failed. Now matches any semver X.Y.Z.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NV4fDaJG9iDB12CV1nmgBm
Numpy-native, renumbering-tolerant matcher (identity fast-path + greedy
cKDTree spatial NN) + generic nodal_field_delta for bathymetric/resolution
deltas between two meshes. Ports Valence diff.py match_nodes; standalone,
does not touch the CHILmesh class. Exposes the interpolation/remap primitive
CHILmesh self-identified as missing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NV4fDaJG9iDB12CV1nmgBm
Extend summary() to fort.13 (grid name + NP + NAttr, 3-line read) and
fort.15 (RUNDES/RUNID, 2-line read). Fixes the mesh_read_guard reroute
target: large *.13 reads reroute to 'chilmesh summary <file>', which
previously raised Unknown mesh format. Advances the #201 frontmatter/
context-management track (text metadata, Python owns the binary payload).
Additive; no locked stage module touched. 6 new tests (29 pass).
Extend summary() to numpy array files: .npy reports shape/dtype/fortran_order
via mmap (no body load); .npz streams each zip member's .npy header off the
archive (numpy.lib.format.read_array_header_*) without reading array bodies.
Completes the mesh_read_guard reroute-target coverage for the numpy formats it
blocks (.msh still gapped — no fixture). Additive; no locked stage module. 8
new tests (37 pass).
domattioli and others added 9 commits July 14, 2026 17:37
…t 2.0.0)

Ground truth (PyPI + GitHub releases): the latest published version is v1.4.0
(2026-07-11); there is no 2.0.0 anywhere. The repo's "2.0.0" was a phantom —
commit 9ec7bd8 prepped it, but that content actually shipped as v1.4.0 (its
release notes list the #187 lexicon rename + geometry/CFL). My earlier 2.0.1
prep was built on that bad metadata. Corrected:

- pyproject.toml + CITATION.cff: 2.0.1 -> 1.4.1
- CHANGELOG: [2.0.1] -> [1.4.1]; the phantom [2.0.0] -> [1.4.0] (2026-07-11,
  matching the actual release) so ordering is coherent; opener no longer calls
  1.4.0 a "Major release" and notes it shipped as 1.4.0 under the
  no-known-consumers judgment
- prebuilt-wheels plan: stale "2.0.0" main-pkg version -> 1.4.x

Next release = 1.4.1 (patch: Rust query O(1) fix + docs; no API change).
v1.4.0 (PyPI/Zenodo) left untouched. Publishing the tag/release stays operator.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RjbNQvHz6tW4G6ArqmLpsc
… + sync

main had 4 commits development lacked (staged-2.0.0 -> 1.4.0 renumber, PyPI
upload --skip-existing, README DOI link, the #252 base). Resolved 7 conflicts:

- pyproject.toml / CITATION.cff -> 1.4.1 (dev's patch layered over main's 1.4.0)
- CHANGELOG.md -> main's authoritative [1.4.0] entry (operator wording) with
  dev's new [1.4.1] section on top
- README.md -> keep dev's frozen-Rust table row + measured perf bullet; main's
  reworked hero / DOI badge / status changes preserved (non-conflicting)
- src/chilmesh/__init__.py -> dev's #255 lazy-load version (its _LAZY_ATTRS map
  covers every name main eager-imported; verified by import + test_lightweight_import)
- src/chilmesh/summary_io.py + tests/test_summary_io.py -> dev's added gmsh (.msh)
  and generic fort.NNN summary support (main lacked it)

Verified in a clean interpreter: chilmesh.__version__ == 1.4.1; all public
names resolve under the lazy loader; 114 tests pass (summary_io +
test_lightweight_import #255 + 76 test_backend_equivalence).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RjbNQvHz6tW4G6ArqmLpsc
…hil + docs site; drop unshippable conda-forge

Rust layer-peel completion removed from Now (#163 closed, Rust frozen). conda-forge
dropped (blocked by the PolyForm Noncommercial license — conda-forge requires a
redistributable/open-source license). Date June->July.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RjbNQvHz6tW4G6ArqmLpsc
Reconciled the three drifted DOIs (header badge 21313196, bibtex/CITATION.cff
20263854) to the latest-release DOI 21199161 via zenodo-publish --reconcile-doi.
Added a clickable Zenodo DOI badge + thesis badge row to the Citation section;
bumped the stale @software bibtex version 1.2.2 -> 1.4.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RjbNQvHz6tW4G6ArqmLpsc
mesh_read_guard reroutes .grd reads to `chilmesh summary` and summary()'s
docstring lists .grd as supported, but no test asserted the reroute target
resolves. TestSummaryGrd guards the .grd → fort14 dispatch (summary_io.py:106).
tests/test_summary_io.py 36→37 passed.
domattioli and others added 2 commits July 18, 2026 14:18
…plit (#260)

_quad_quality and element_quality routed quad min_angle/max_angle through a
diagonal triangle split returning min-of-sub-triangle values, so max_angle
under-reported obtuse quads (a 128.66-deg corner read 90 deg) and min_angle
returned a triangulation artifact (45 deg for a 90-deg unit square). Both now
derive from the element's own four interior angles, matching the skew/eas
branches in the same function.

- quality.py: _quad_quality gains a min_angle/max_angle branch (raw angles,
  radians); element_quality routes both metrics to _quad_quality instead of
  splitting.
- tests: two bug-codifying split assertions rewritten to the raw values;
  add skewed-quad regression (max=128.66 / min=51.34 deg) from the issue repro.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FpaAKD7SoE8zSx2BEeAVTu
read_fort14_raw + CHILmesh.read_from_fort14 conflated a present-but-empty
NOPE/NBOU block (physically 0/0/0/0) with an absent boundary section, both
yielding empty segment lists with no way to tell them apart. Add an additive
boundaries_present flag (Fort14Raw field + CHILmesh instance attr) set True
only when the block is physically parsed; stays False when absent or when
parse_boundaries=False. Distinguishes a boundaryless mesh from one stripped
in its lineage (Valence #13/#216 downstream symptom).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UsjeLCBpMSbXMffrdkBiQe
Operator answered #247 item 1 (2026-07-12): currently unaffiliated
(previously PSU during modernization, OSU at initiation). Aligns
CITATION.cff with the README 'Unaffiliated' author line. Kubatko/OSU-CHIL
co-author entry unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01216xCkHDCNF1CMsoeqzPYA

Copy link
Copy Markdown
Owner Author
---
date: 2026-07-20
session: 01216xCkHDCNF1CMsoeqzPYA
repo: CHILmesh
severity: low
freq: recurring-across-sessions
issues: ["#247"]
wasted_min: 0
wasted_tok: 0
missing_skill: none
dispatches_used: 0
slice_outcome: shipped — CITATION.cff primary-author affiliation → Unaffiliated (a4de4dd), #247 fully closed
---

# CHILmesh rotation hour-14 — R5

## Slice shipped
- `a4de4dd` docs: primary-author affiliation `Pennsylvania State University` → `Unaffiliated` per operator answer (#247 item 1). CFF YAML parses clean; repo-wide `Pennsylvania State` grep now zero. #247 item 2 (stale "57 tests") already shipped `a54f88d`. Both items resolved → #247 closed completed. Rolling PR #258 body rolled.
- dispatches: 0 (one-line doc fix = inline mechanical edit, no dispatch).

## Spillover
- CHILmesh offline code queue drained (only research/brainstorming/env-gated/operator-gated remain). STOP met → spilled per fixed order.
- DomI: skipped — first-party code axis live-verified drained hour-12 today (ruff F/B/E9 + detect-dead-code + detect-unreachable all zero); remaining queue research/gated/large-feature.
- Valence: bootstrapped (pin SYNCED c430fc2); ready queue = large full-stack (#282/#292), CI (#293), release-gated (#281); one clean offline pattern (untracked test-pin campaign) not a bounded tracked slice → no spillover ship. Left clean (read-only, no commits).

## Pains
- pain: two prior CHILmesh rotation sessions (07-14, 07-19) re-flagged #247 item 1 as "operator-gated, won't guess" despite operator having answered it on 07-12; mechanically-fixable doc drift sat unfixed ~8 days
  frequency: recurring-across-sessions
  severity: low
  evidence: "#247 comment 4953096832 (operator answer 07-12) vs 4972873558/5016063576 (07-14/07-19 both re-flag gated)"
  missing_skill_would_have_prevented_it: none — process gap (re-read full issue thread incl. operator comments before re-asserting an item is operator-gated)
  domi_issue: null

[model: claude-fable-5, repo: CHILmesh, session: 01216xCkHDCNF1CMsoeqzPYA, effort: low]


Generated by Claude Code

The downstream migration guide (v1.0, 2026-04-27) documented only the
v0.1.1->v1.0.0 Mesh-alias migration and asserted 'existing code keeps
working' — but v1.4.0 shipped the #187 breaking renames with no aliases,
which that guide (cited by #257 as the rename-migration authority) never
covered. Add a prominent 'v1.4.0 Breaking Renames (#187)' section:
rename map (skeletonize->peel_layers, _skeletonize/_layerize->_peel,
reskeletonize_local->repeel_local, skeletonize_diff->layers_diff),
smooth_mesh keyword-only sdf/size_fn (#251), a cross-version getattr
shim, and pin guidance. Mapping verified against installed chilmesh
1.4.1. Version-compat table + header/footer refreshed. Docs-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018NbQPRUP1Z7n7iWgicuimW

Copy link
Copy Markdown
Owner Author
---
date: 2026-07-22
session: 01JDVAmPYKnmykK6MnNKtyGs
repo: CHILmesh
severity: low
freq: once
issues: [257, 197, 117]
wasted_min: 0
wasted_tok: low
missing_skill: none
---

# CHILmesh hour-14 rotation retro

## shipped
- #257 downstream-rename audit COMPLETE → closed. symbol-level re-verify all on-disk chilmesh consumers vs v1.4.0 #187 renames → no hard break in verifiable scope. one guarded soft-degrade (QuADMESH validator.py:122 `_skeletonize` hasattr) routed out as QuADMESH #117 w/ fix. slice-class maintenance.
- #197 (smoother vs size-fn) research note. traced smooth_mesh dispatch → only method='sdf' threads size_fn; fem/angle smoothers size-blind (not forwarded via **kwargs) → erase truss grading = OP symptom. posted A/B/C design fork, rec B. advance-only. slice-class design.
- QuADMESH #117 filed (cross-repo triage from audit).

## dispatch
- 0 of ≤3. audit + research notes = zero code subagents. no code commit (all GitHub-side).

## pains

- pain: rolling-PR body roll needs full-body replace; MCP update_pull_request would force hand-transcribe of 8KB templated body (corruption risk)
  frequency: once
  severity: low
  evidence: PR #258 body 7248→8967 chars; used curl API read-modify-write to preserve prior blocks byte-faithfully
  existing_skill_should_have_caught_it: none
  missing_skill_would_have_prevented_it: none — process gap (programmatic RMW is correct; MCP round-trip is lossy for large bodies)
  domi_issue: null
  saved_time_estimate_min: 0

## preflight
- branch-policy-conflict: harness injected claude/bold-wozniak-j1dsud → switched to development at start (CLAUDE.md precedence). no orphan branch.
- mcp-scope-gap: none (all targets in scope).
- label-scheme-mismatch: none.

## next
- QuADMESH hour-16 rotation (today) picks up #117 validator fix.
- #155 priority:now still gated on hosted runner for global STOFS-2D-Global mesh (Valence #77) — no in-env slice.

[model: claude-opus-4-8, repo: CHILmesh, session: 01JDVAmPYKnmykK6MnNKtyGs, effort: medium]


Generated by Claude Code

)

Ran the like-for-like cross-language bench on EasternPacific_ENPAC2003
(531,680 elems), reachable from the Valence sibling checkout. Rust
full-init 11.98 s (== Python 11.89 s same-machine, ~15x slower than C++
0.803 s), quality 2 ms, n_layers=75 across all backends. Fast-init/peel
stay n/a (Rust does not expose fast_init separately, #163). Corrects the
stale 'mesh lives outside the repo' claim in README + RUST_EVALUATION.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRrArhjkdyXw3fY2oqyvz6

Copy link
Copy Markdown
Owner Author
---
date: 2026-07-23
session: 01VRrArhjkdyXw3fY2oqyvz6
repo: CHILmesh
severity: low
freq: once
issues: ["#250", "#155", "#261"]
wasted_min: 8
wasted_tok: low
missing_skill: none
---

session: 01VRrArhjkdyXw3fY2oqyvz6
repo: CHILmesh
hour: 14 UTC
slice_class: docs
dispatches_used: 0
shipped:
  - issue: "#250"
    what: "fill Rust ENPAC2003 benchmark cells; mesh now in-env from Valence sibling checkout"
    commit: 65c2236
    verify: "ran like-for-like cross-lang bench, all 3 backends built + run same-machine, n_layers=75 parity; Rust full 11.98s ~= Python 11.89s, ~15x slower than C++ 0.803s"
    closed: true
priority_now_checked:
  - issue: "#155"
    disposition: "env-blocked (global STOFS-2D-Global 24.9M/1.73GB not in-env); already operator-surfaced #261 status:needs-operator; no re-diagnose (noted 12x)"
pains:
  - pain: "fresh container lacks numpy/scipy/chilmesh + C++/Rust backends; must venv + build both before any bench"
    frequency: recurring-across-sessions
    severity: low
    existing_skill_should_have_caught_it: ensure-test-venv
    domi_issue: null
  - pain: "benchmark.py couples cross-lang table with OOM-prone FEM-direct lifecycle under one --max-elements gate; gating heavy meshes drops the table too — no CLI path emits table-only on a 531k mesh"
    frequency: once
    severity: low
    missing_skill_would_have_prevented_it: none  # tooling gap: benchmark.py --no-lifecycle flag
    domi_issue: null
votes: []
new_requests: []  # frequency gate: no pain >=2x
notes: "queue decision-bottlenecked per #261's own finding (bottleneck = decisions not execution); one measurement-backed doc slice shipped."

[model: claude-opus-4-8, repo: CHILmesh, session: 01VRrArhjkdyXw3fY2oqyvz6, effort: medium]


Generated by Claude Code

…ontradiction (#223)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PDT2YZgEu6DoXPKMzHCd85
@claude

claude Bot commented Jul 24, 2026

Copy link
Copy Markdown
---
date: 2026-07-24
session: 013NhKuhHJwC9wmmysELCufc
repo: CHILmesh
severity: low
freq: once
issues: [223, 197, 155, 261]
wasted_min: 0
wasted_tok: 0
missing_skill: none
dispatches_used: 0
slice_outcome: shipped research.md #223 (f97104e) + advanced #197/#223 brainstorming->needs-operator
---

```yaml
session: 013NhKuhHJwC9wmmysELCufc
repo: CHILmesh
hour: 14
branch: development
dispatches_used: 0
slices:
  - class: design
    issue: 223
    action: committed research.md (.specify/specs/003-skeletonize-medial-rule/research.md)
    commit: f97104e
    detail: >
      spec'd option-1 front-collision medial rule vs current post-#187 _peel code;
      surfaced CONCEPTS.md self-contradiction (line19 medial-axis vs lines90-105 topological-thinning)
      as the real root cause of 5wk decision-limbo. flipped brainstorming->needs-operator.
  - class: design
    issue: 197
    action: crystallized 2026-07-22 A/B/C fork into per-issue operator ratify
    commit: null
    detail: brainstorming->needs-operator; option B recommended (guard geometry smoothers + doc sdf path).
  - issue: 155
    action: checked (priority:now) not advanced
    detail: regional-WNAT done; global STOFS-2D-Global 24.9M elem env-blocked (Valence #77); noted, no new comment.
pains:
  - pain: gh CLI absent in container; all GitHub writes via curl+$GITHUB_TOKEN against api proxy.
    frequency: recurring-across-sessions
    severity: low
    evidence: "gh: command not found; curl PATCH/POST HTTP 200/201 used instead"
    existing_skill_should_have_caught_it: none
    missing_skill_would_have_prevented_it: none — env condition, curl fallback works
    domi_issue: null
    saved_time_estimate_min: 0
telemetry_routing: PR #258 description (primary) + this deposit
<!-- /INTROSPECT-DEPOSIT -->


_[model: claude-opus-4-8, repo: CHILmesh, session: 013NhKuhHJwC9wmmysELCufc, effort: routine]_


---
_Generated by [Claude Code](https://claude.ai/code)_

…#256)

Phase 1a of #256 asked for a real full_init smoke, not just a symbol
probe. The cibuildwheel CIBW_TEST_COMMAND now builds a 2-triangle unit
square, calls chilmesh_cpp.full_init, and asserts the built adjacency +
skeleton (4 verts / 2 elems / 5 edges / adjacency_built / >=1 layer /
edge2vert shape (5,2)) so an empty or broken binary fails the build.
Adds CIBW_TEST_REQUIRES=numpy for the array inputs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018z9MobkyDkCqHasxikpEpi
domattioli and others added 2 commits July 26, 2026 14:15
Wire the Phase 2 PyPI publish pipeline for the chilmesh_cpp binary backend:
manylinux wheels (reusing the Phase 1a cibuildwheel + full_init smoke) + sdist,
gated on GitHub release / manual dispatch only (no push trigger, so nothing
publishes from development). Uses PyPI Trusted Publishing (OIDC) with a
commented token fallback; publish job protected by environment: pypi. macOS and
Windows legs stay deferred to Phase 1b (#225 billing gate). Registered in
LOCAL.md per spec-010 v3 creation gate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176pc8LGNFpQZ9Kj6RU9ht9
Advance-only research note for the size-controlled cartogram request: maps the
proposed mesh.cartogram(kind=noncontig|unrolled|hybrid) API onto the current
chilplotting (plot_filled/build_polygons) + layer_paths (paths_on_outer_vertices)
+ mesh.layers substrate, with per-kind algorithm, validation plan, tiered backlog,
and four operator questions that would turn it status: ready. No implementation
(brainstorming entitlement: advance only, no label flip).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176pc8LGNFpQZ9Kj6RU9ht9
@claude

claude Bot commented Jul 26, 2026

Copy link
Copy Markdown
---
date: 2026-07-26
session: 013NhKuhHJwC9wmmysELCufc
repo: CHILmesh
severity: low
freq: once
issues: "#256, #219"
wasted_min: 1
wasted_tok: low
missing_skill: none
dispatches_used: 0
slice_outcome: "2 slices shipped — #256 Phase 2 publish-cpp-wheels.yml (code); #219 cartograms research.md (design)"
---

```yaml
session: 013NhKuhHJwC9wmmysELCufc
repo: CHILmesh
hour: 14
dispatches_used: 0
slices:
  - issue: "#256"
    class: code
    deliverable: ".github/workflows/publish-cpp-wheels.yml (Phase 2, release-gated PyPI publish; sha 75cf769)"
    verified: "yaml parse + no-push-trigger + ast-clean CIBW payload + local conformance-lint sim CLEAN + LOCAL.md registered"
  - issue: "#219"
    class: design
    deliverable: ".specify/specs/004-mesh-cartograms/research.md (grounded in chilplotting/layer_paths/mesh.layers; sha 2b850ed)"
    verified: "API line refs cross-checked against src (plot_filled:205, build_polygons:100, paths_on_outer_vertices:51)"
pains:
  - pain: "add_issue_comment MCP call rejected issueNumber; correct param is issue_number"
    frequency: once
    severity: low
    evidence: "error: missing required parameter: issue_number (1 retry)"
    existing_skill_should_have_caught_it: none
    missing_skill_would_have_prevented_it: none — MCP-param naming, process-trivial
    domi_issue: null
    saved_time_estimate_min: 1
notes:
  - "#155 priority:now still env-blocked (global STOFS mesh, hosted runner); noted 13x, surfaced #261 — no re-diagnose."
  - "PR #258 mergeable_state dirty = pre-existing operator reconcile (main Zenodo commits overlap development); unrelated to this push."
  - "clean session, no bumpy signals (0 tool failures, 0 rework, 0 policy violation)."
---

[model: claude-opus-4-8, repo: CHILmesh, session: 013NhKuhHJwC9wmmysELCufc, effort: medium]


Generated by Claude Code

domattioli and others added 2 commits July 27, 2026 14:21
…us (#261)

Repo is v1.4.1; the doc still describes the 2026-04-26 v0.1.1->v0.2.0
plan with obsolete 'You are here' Phase-0 markers. Adds a staleness
banner routing readers to README Status & Roadmap; content preserved
as historical record. Retire-vs-refresh disposition left to operator
per #261.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PDcuGMABcfwCuGuuKzpVPn
…cripts

Closes #266: _require_int() replaces the seven validation-only int()
assignments (ruff F841) in gmsh_io.py; GmshParseError type + every
test-asserted message substring preserved.
Closes #263: the 11 bandit B108 sites in benchmark/scene scripts now use
CHILMESH_OUT_DIR (default repo-relative output/, gitignored) for
deliverables and VALENCE_DATA_DIR for mesh lookups.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y176b4wa1HubNNk9FLRn5g
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment