Rolling development → main - #258
Draft
domattioli wants to merge 63 commits into
Draft
Conversation
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.
…ng, culling, peel reveal, metric keys)
…in-place histogram, mean=red
…t kwargs, equal-motion pacing, peel reveal, size budget)
…ain, scripted SC audits)
…provenance, real CHILmesh guard, 18f holds, T026/T027
…ss/T_truss provenance, prose sync
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).
…(spec 002 FR-001)
…cked histogram, color-keyed metrics (spec 002)
…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
… no MEX) 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.
1 task
…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
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
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
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
---
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 |
…#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
6 tasks
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
---
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 |
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Latest session (2026-09-02 — operator-directed dev-cleanup follow-ups: #266 gmsh validation helper + #263 hardcoded
/tmp)_require_int()validation helper +/tmpremoval (82881d3, closes chore: keep the gmsh reader's validation-only parses but silence the F841 warnings #266 + chore: replace hardcoded /tmp paths in benchmark and scene scripts (bandit B108, 11 sites) #263)int()assignments ingmsh_io.py(ruff F841) replaced by_require_int(token, what)→GmshParseError("malformed {what}: non-numeric {token!r}"), applied consistently in_read_msh_v2_2+_read_msh_v4_1.int()inside its enclosingexcept (ValueError, IndexError)so the test-asserted"Element line malformed"message survives — the subagent had broken threematch=contracts; caught by the orchestrator's own run oftest_gmsh_io.pyand restored before commit.CHILMESH_OUT_DIRenv, default repo-relativeoutput/(gitignored,mkdir -p).WNAT_Hagen.14) →VALENCE_DATA_DIRenv, default~/valence-domains.ruff --select F841 gmsh_io.pyclean; own malformed-.mshprobe →GmshParseError;test_gmsh_io.py65/65;pytest -k 'not block_o'1488 passed / 79 skipped (identical count to the chore: repo cleanup (static analysis sweep) #268 sweep baseline);grep '/tmp' scripts/→ 0;bandit -r scripts -t B108→ 0; all 8 scriptspy_compileclean.pypi_publish.pyB310/B110 mentioned in chore: replace hardcoded /tmp paths in benchmark and scene scripts (bandit B108, 11 sites) #263 left to its own track.Prior session (2026-07-27 hour-14 rotation — project_plan.md staleness banner (#261) + #201 flipped to needs-operator)
.planning/project_plan.mdstaleness banner (34e8296, serves zoom-out audit: roadmap doc stale + 5 issues parked in decision-limbo (project_plan.md, #201/#223/#197/#219/#155) #261)Current Version: 0.1.1 (Alpha)/Planning Date: 2026-04-26while the repo is v1.4.1 stable — flagged stale by the lastzoom-outaudit (zoom-out audit: roadmap doc stale + 5 issues parked in decision-limbo (project_plan.md, #201/#223/#197/#219/#155) #261)..chilformat flippedstatus: brainstorming→status: needs-operator— 15 comments over 7 weeks exhausted the non-gated design work; what remains is the .chil file format design — session byproduct, decisions, and adversarial review #154 RESHAPE blockers decision.status: needs-operator— constitution:26/:67/:123still describe shipped features as future; fix edits the supreme governance doc → operator only.priority: now) checked, not advanced — only the global STOFS-2D-Global (24.9M elems, 1.73 GB) lifecycle remains; env-blocked, already operator-surfaced in zoom-out audit: roadmap doc stale + 5 issues parked in decision-limbo (project_plan.md, #201/#223/#197/#219/#155) #261.Prior session (2026-07-26 hour-14 rotation — #256 Phase 2 release-gated
publish-cpp-wheels.ymlshipped)publish-cpp-wheels.yml(75cf769, feat: prebuilt C++ binary wheels on PyPI (chilmesh[cpp]) #256 Phase 2) —release: [published]+workflow_dispatchonly (no push trigger); PyPI Trusted Publishing (OIDC) primary;publishjob behindenvironment: pypi; macOS/Windows legs gated on ci: push-event CI runs startup-fail (0 jobs) — macOS/Windows matrix can't launch (operator/billing-gated) #225. Workflow-conformance lint simulated locally → CLEAN.research.md(2b850ed) — maps the proposedmesh.cartogram(kind=…)API onto the current substrate with verified line refs; four operator questions posed.Prior session (2026-07-25 hour-14 rotation — #256 Phase 1a real
full_initCI smoke shipped)811110f) —CIBW_TEST_COMMANDnow executeschilmesh_cpp.full_initon 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)f97104e) —docs/CONCEPTS.mddefinesskeletonize()two incompatible ways (medial axis vs connectivity-preserving thinning);research.mdspecifies option (1) front-collision medial extraction reusing_peel's layer index; Implement a real skeletonize() — connectivity-preserving thinning peel, distinct from _layerize (needs the precise medial rule) #223 flipped →needs-operator.needs-operator(Option B recommended: guard the geometry smoothers + doc thesdfpath).Prior session (2026-07-23 hour-14 rotation — #250 Rust ENPAC2003 cells filled)
65c2236, closes perf: fill Rust/C++ ENPAC2003 timing cells in README validation tables (follow-up to #163 closure) #250) — Rust full-init 11.98 s ≈ Python 11.89 s, ~15× slower than C++ 0.803 s on ENPAC2003 (531k elems); README +docs/RUST_EVALUATION.mdcorrected.Prior session (2026-07-22 hour-14 rotation — #257 downstream-rename audit closed + #197 size-blindness note)
chilmeshCLI for shell-friendly mesh inspection / conversion / smoothing #117.method='sdf'threadssize_fn;fem/angle-basedare size-blind.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.cffaffiliation →Unaffiliated(a4de4dd, closes #247).Prior session (2026-07-19 hour-14 rotation) — fort.14
boundaries_presentpresence flag (11e2a49, closes #259).Prior session (2026-07-18 hour-14 rotation) — quad
min_angle/max_anglecorrectness fix (183652f, closes #260); fast suite 1484 passed.Prior session (2026-07-16 hour-14 rotation) —
.grdsummary reroute regression guard (db6f290).Prior session (2026-07-15 hour-14 rotation) —
.domi-pinsyncc430fc2(adbcbb8); #257 audit.Notes / reconciliation (operator)
maincarries 4 commits not ondevelopment(94b4e08CFF 1.4.1,28be8b7/806e092Zenodo DOI + README link, and the Rolling development → main #254 merge). They overlapdevelopment's own Zenodo-DOI doc commit (2bfb838) → reconcile at promotion.769bcdcREADME roadmap refresh;9735003/2bfb838MATLAB-bridge + Zenodo badge docs.Rolling
development → mainstaging PR (prior rolling PR #254 merged an earlierdevelopmentsnapshotf1444b6; 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]