Skip to content

Commit 58f5a5e

Browse files
andyclaude
andcommitted
CLAUDE.md: record this session's transferable findings
Five new pitfall classes, each found by a real failure and each with a sibling worth checking for: * A code's theory NAME must not equal its CATEGORY. CalcEd inferred the "None"-named-theory case by comparing the combo label against the category, which for Quantum ESPRESSO (category="PW" name="PW") produced a theory in no .edml -- and TWO unrelated-looking faults followed, the Basis Set Tool staying enabled for a plane-wave code and an empty runtype list. Audited: QE was the only code where they collide, which is why it survived every other integration. * CalcEd used to discard the input generator's error message, overwriting the captured stderr with a generic failure line. Every ai.<code> dies with something specific and none of it reached the screen. Same shape as eccejobmaster logging to /dev/null. * Open Inventor's redraw sensor is a one-shot that re-arms on render, and with a render callback installed nothing re-arms it. That was #99. Records the two theories DISPROVED on the way -- the render cache and a stranded p_redrawPending -- so neither is revisited, and amends the older renderCB entry which those had pointed at. * A parser with nothing able to request its input is dead code, and looks identical to "no fixture exercises it" (ORCA's CHELPG, #88). * "The code accepted the keyword" is not "the keyword works". Eleven ORCA keywords passed its input check and two died at runtime. Also records that the Gateway window no longer appears and how to bring it back for a session, since that changes what starting ECCE looks like. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EFMUNbw2UpRPmgsqviAowb
1 parent 0889fef commit 58f5a5e

1 file changed

Lines changed: 84 additions & 0 deletions

File tree

‎CLAUDE.md‎

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ intentionally *not* a running log of past sessions. For that, see
1919
branch from or compare against them.
2020
- Build directory is `build-cmake` (not `cmake-build`) — `ninja` or
2121
`cmake --build .` from inside it.
22+
- **The Gateway window no longer appears** (#93, 2026-09-22). `ecce`
23+
starts the services and opens the **Organizer** directly, which is now
24+
the front door: the launcher entries live on its File menu (New
25+
Structure) and Tools menu (Register Machines, Machine Browser,
26+
Periodic Table). The Gateway *process* is unchanged and still owns the
27+
session — JMS, service startup, `ecce_get_app`, Quit-and-Stop-Server —
28+
only its frame is hidden, which is one guarded `Show()` call. To get
29+
the old window back for a session: `ECCE_GATEWAY_WINDOW=1 ecce`. If a
30+
UI decision like this needs reversing, prefer that env var to a
31+
revert.
2232
- `GETTING_STARTED.md` (repo root) has the full build/package/install/
2333
first-login walkthrough. Don't reproduce it here.
2434
- **Memory settings should be entered/labeled in GB everywhere, for
@@ -337,6 +347,73 @@ Both per-user, both non-root, both started automatically by the
337347
job/comm layer, general utilities. No wx dependency.
338348

339349
### Known pitfall classes (found more than once — check for siblings)
350+
- **A code's theory NAME must not equal its CATEGORY.** `CalcEd::
351+
getTheoryName()` reverses `populateTheories()`'s display convention —
352+
the combo shows `name()` for every theory except one literally named
353+
`"None"`, where it shows `category()` — and it used to detect that
354+
case by comparing the label against the category. For Quantum
355+
ESPRESSO, whose theory is `category="PW" name="PW"`, that returned
356+
`("PW","None")`: a theory in no `.edml`. **Two unrelated-looking
357+
faults followed from it**, which is why it took a while to see:
358+
`JCode::theoryNeedsBasis()` returns `true` for a theory it cannot
359+
find, so the Basis Set Tool stayed enabled for a plane-wave code
360+
*despite* `needsBasis="false"` being correct; and `populateRuntypes()`
361+
found nothing, giving "No runtypes are supported for the given
362+
code/theory combination" with nothing to edit or launch. Fixed by
363+
asking the code whether a `"None"`-named theory exists rather than
364+
inferring it from the label. Audited: QE was the only code where name
365+
equals category, which is why it survived every other integration —
366+
but check it when adding one.
367+
- **CalcEd used to discard the input generator's error message.**
368+
`execout()` captures the generator's stdout+stderr into `message`, and
369+
the failure branch overwrote it with a generic "input parsing command
370+
... failed". Every `ai.<code>` validates in its main flow and dies with
371+
something specific and actionable — `ai.qe`'s periodicity check even
372+
names the Builder panel to use — and none of it reached the screen.
373+
Fixed (the generator's output now leads the message), but the lesson
374+
generalises: when a script's diagnostics are the only explanation of a
375+
failure, check that whatever shells out to it actually shows them.
376+
Same shape as `eccejobmaster` logging to `/dev/null`.
377+
- **Open Inventor's redraw sensor is a ONE-SHOT that re-arms on render,
378+
and with a render callback installed nothing re-arms it.** This was
379+
#99: stepping a geometry trace moved the atoms once and then never
380+
again. `GTStepCmd` ran every step with changing coordinates,
381+
`SGFragment::getAtomCoordinates()` reads `TAtm` live so the scene
382+
always had fresh data, `touchChemDisplay()` and `sgfrag->touch()` were
383+
both called — and `SoWxRenderArea::renderCB` was entered for step 0
384+
and then *not once* for the thirteen steps after it. The redraw was
385+
never requested. Fixed by calling `SGViewer::refreshRenderArea()` at
386+
the end of `processStep()`, which forces a wx paint and does not
387+
depend on that sensor; applied to `GeomTracePropertyPanel` and
388+
`NModePanel`. **Two plausible theories were disproved on the way and
389+
should not be revisited**: the render cache (disabling caching
390+
process-wide changed nothing) and a stranded `p_redrawPending` in
391+
`OnPaint` (that retry path is fine — it never had a callback to
392+
service). If a viewer stops updating while the data demonstrably
393+
changes, instrument `renderCB` first: `ECCE_DEBUG_GEOMTRACE=1` prints
394+
`[RENDERCB]` lines alongside the step trace, and their *absence* is
395+
the finding.
396+
- **A parser with nothing able to request its input is dead code, and
397+
the suite will not tell you.** `orca.desc` parsed `CHELPG Charges`
398+
into ESPCHARGE from the day ORCA was integrated, but neither
399+
`ai.orca` nor the runtype dialog could ever put `CHELPG` on the route
400+
card, so the property never appeared for any job (#88). The parse
401+
type simply never fired, which looks identical to "no fixture
402+
exercises it". When adding extraction for a property, check that
403+
something can *ask the code to produce it* — and when a parse type
404+
never fires, establish which of the two it is (see
405+
`tests/parsers/cases.py`'s `KNOWN_DEAD` vs `UNCOVERED`, and the gate
406+
that now forces every non-firing entry to be classified).
407+
- **"The code accepted the keyword" is not "the keyword works."** All
408+
eleven ORCA correlated/double-hybrid keywords passed ORCA's input
409+
check; two of them then died at runtime — double hybrids route their
410+
correlation through RI-MP2 and need a `<basis>/C` auxiliary basis
411+
(`ERROR: RI-MP2 needs an AuxC basis but none was defined!`, exit 55).
412+
Offering them without it would have shipped decks that always fail,
413+
*after* reaching a queue. Run a real job, not a syntax check. The same
414+
discipline found that GROMACS's double-row energy blocks and QE's
415+
header-carried units both silently produce wrong values rather than
416+
none.
340417
- **`ai.<code>`'s template engine silently swallows `die()`** (#92).
341418
`modifyInputFile` resolves every `##tag##` through `eval "&$subname"`,
342419
so a `die` inside a resolver — or anything it calls — is caught, the
@@ -543,6 +620,13 @@ Both per-user, both non-root, both started automatically by the
543620
that a symptom is this bug rather than a data problem. Fixed with a
544621
pending-redraw flag (`p_redrawPending`) that `OnPaint()` checks and
545622
acts on once the in-flight paint finishes.
623+
**UPDATE 2026-09-22: that fix is correct but was not the cause of
624+
#99.** The `p_redrawPending` retry path works; it simply never had a
625+
callback to service, because the scene manager's redraw sensor is a
626+
one-shot that re-arms on render and nothing re-armed it. See the
627+
one-shot entry in the pitfall list above. Do not re-investigate
628+
`p_inPaint`/`p_redrawPending` for a "viewer stops updating" symptom
629+
without first checking whether `renderCB` is entered at all.
546630
- **OPEN, UNRESOLVED (2026-09-17): the Vibrational Frequencies panel's
547631
Animation/Vector radio box doesn't deliver its click event under
548632
wx3.2/GTK3** — confirmed live via strace (syscall-level, a synthetic

0 commit comments

Comments
 (0)