Skip to content

fix(core): load the compositional models and unbreak the build tree - #216

Merged
hyperpolymath merged 1 commit into
mainfrom
arena/0ff97d53-metamanifold-webui
Oct 23, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
arena/0ff97d53-metamanifold-webui

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What is broken on main

using MetaManifold fails on c978994, so the Julia suite cannot run at all. Two merge artefacts are left over from the compositional-differential work:

File Fault
src/core/doi.jl module DOI declared twice (lines 4 and 21). The inner declaration swallows the module body and leaves the outer one without an end, so the file cannot be included.
src/MetaManifold.jl analysis/clade_cumulus.jl included twice, and analysis/compositional.jl never included. Differential does using ..CompositionalModels, so loading dies with UndefVarError: CompositionalModels not defined.

The routes (#211), the frontend and the unit tests are already correct; this is the remaining piece that keeps the package from loading, plus the documentation the merge dropped.

Changes

  • src/core/doi.jl — remove the duplicated module DOI.
  • src/MetaManifold.jl — drop the duplicate clade_cumulus include; include analysis/compositional.jl before analysis/differential.jl, with a comment explaining the ordering requirement.
  • README.md — restore the ancom_bc, aldex2, songbird, multinomial and dirichlet_multinomial method bullets, the "why a count model", "choosing the reference taxon" and "overdispersion" sections, and the nine-method analysis.differential config block (including mn_reference_taxon, mn_penalty, dm_overdispersion_method, max_iter, tolerance, max_seconds).
  • ROADMAP.md, docs/statistics/zero-handling.md — describe the five compositional models and note that the multinomial models replace no zero.

songbird (R) and multinomial (Julia) remain two implementations of the same baseline-category model, both selectable, neither an alias — as documented in src/analysis/differential.jl.

Verification

  • ./node_modules/.bin/tsc --noEmit -p . — 0 errors.
  • bun test src — 85 pass / 0 fail.
  • tree-sitter-julia parse of every src/**/*.jl and test/**/*.jl — clean (same three known parser false positives as before).
  • Cross-reference audit: every Differential.x / CompositionalModels.x reference resolves.
  • Julia itself is not available in the working environment, so test/runtests.jl runs here in CI for the first time since the merge.

Known, out of scope

src/server/routes/cladistics.jl is not included by src/server/server.jl, and it calls CladeCumulus.asv_tip_name / CladeCumulus.analyse_phylogeny, which do not exist. Wiring it in as-is would break the server, so it is left untouched; the Cladistics build API needs a follow-up.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-23T00:32:53.726073Z
We couldn’t complete this review. Comment @codex review to try again.
b1022be PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 36 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: a59c8d30-2310-42db-87a6-7bcdbc893387
📥 Commits

Reviewing files that changed from the base of the PR and between 50a0e7f and a840c5e.

📒 Files selected for processing: 2
  • ROADMAP.md
  • docs/statistics/zero-handling.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Fork governance

Lane Status Run
DEED syntax (repo deed) 🟢 conformant run 39880294701
Hypatia verdict grid purple (job: success) same run

Hypatia grid purple

🟣 critical · commit a840c5e65a3c · run 39880294701

Reporter Status Critical High Medium Minor Since previous revision
Hypatia scan 🟣 critical 47 63 31 0 ↔ unchanged
panic-attack assail 🔴 high 0 6 13 0 ↓ regressed (1 more blocking)
pons asinorum 🟡 medium 0 0 10 0 ↔ unchanged
rhodibot (RSR compliance) 🟠 indeterminate 0 0 0 0 — indeterminate
panicbot (panic recovery, error handling) 🟠 indeterminate 0 0 0 0 — indeterminate
echidnabot (formal verification: proofs/) 🟠 indeterminate 0 0 0 0 — indeterminate
seambot (integration health: API routes) 🟠 indeterminate 0 0 0 0 — indeterminate
finishingbot (release readiness) 🟠 indeterminate 0 0 0 0 — indeterminate
accessibilitybot (WCAG on the React UI) 🟠 indeterminate 0 0 0 0 — indeterminate
glambot (presentation quality) 🟠 indeterminate 0 0 0 0 — indeterminate
cipherbot ⚪ not applicable 0 0 0 0 ↔ unchanged
sustainabot ⚪ not applicable 0 0 0 0 ↔ unchanged
Hypatia scan: 141 finding(s)
  • critical cicd_rules/banned_language_file — frontend/src/views/run/parseFilterYaml.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/encode.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/charts.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/export.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/figure.test.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/legend.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/figure/types.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/utils/download.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/utils/text.test.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/utils/timeago.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/utils/text.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useUnsavedGuard.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useApi.test.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useApi.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useAnalysis.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useSSE.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useTabParam.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useNavRefresh.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/hooks/useJobEvents.ts — TypeScript file detected -- banned language
  • critical cicd_rules/banned_language_file — frontend/src/about.ts — TypeScript file detected -- banned language
  • 121 more; see the structured report in the artifact.
panic-attack assail: 19 finding(s)
  • high DynamicCodeExecution — src/pipeline/dada2/context.jl — eval/Meta.parse in src/pipeline/dada2/context.jl
  • high DynamicCodeExecution — src/analysis/analysis.jl — eval/Meta.parse in src/analysis/analysis.jl
  • high DynamicCodeExecution — src/analysis/differential.jl — eval/Meta.parse in src/analysis/differential.jl
  • high DynamicCodeExecution — src/core/provenance.jl — eval/Meta.parse in src/core/provenance.jl
  • high DynamicCodeExecution — scripts/check-julia-syntax.jl — eval/Meta.parse in scripts/check-julia-syntax.jl
  • high DynamicCodeExecution — test/unit/test_permanova.jl — eval/Meta.parse in test/unit/test_permanova.jl
  • medium UnsafeFFI — src/core/memory_probe.jl — 3 ccall/FFI calls in src/core/memory_probe.jl
  • medium InputBoundary — src/server/routes/runs.jl — 2 JSON3.read/JSON.parse call(s) with 0 try block(s) in src/server/routes/runs.jl — these throw on malformed input; wrap in try/catch
  • medium InputBoundary — src/server/routes/composition.jl — 6 JSON3.read/JSON.parse call(s) with 2 try block(s) in src/server/routes/composition.jl — these throw on malformed input; wrap in try/catch
  • medium InputBoundary — src/server/routes/studies.jl — 4 JSON3.read/JSON.parse call(s) with 2 try block(s) in src/server/routes/studies.jl — these throw on malformed input; wrap in try/catch
  • medium InputBoundary — src/server/routes/analysis.jl — 9 JSON3.read/JSON.parse call(s) with 3 try block(s) in src/server/routes/analysis.jl — these throw on malformed input; wrap in try/catch
  • medium UnsafeFFI — install.jl — 1 ccall/FFI calls in install.jl
  • medium ProofDrift — test/unit/test_occupancy_grade.jl — 2 `@test x isa Y` assertion(s) with no value check — type-only tests may substitute for an unwritten formal theorem in test/unit/test_occupancy_grade.jl
  • medium ProofDrift — test/unit/test_evidence.jl — 1 `@test x isa Y` assertion(s) with no value check — type-only tests may substitute for an unwritten formal theorem in test/unit/test_evidence.jl
  • medium InputBoundary — bench/advanced_zero_handling/benchmark.jl — 1 JSON3.read/JSON.parse call(s) with 0 try block(s) in bench/advanced_zero_handling/benchmark.jl — these throw on malformed input; wrap in try/catch
  • medium InputBoundary — frontend/src/figure/charts.ts — 1 JSON.parse call(s) with 0 try block(s) in frontend/src/figure/charts.ts — JSON.parse throws SyntaxError on malformed input; wrap in try-catch
  • medium InputBoundary — frontend/src/tree/model.ts — 1 JSON.parse call(s) with 0 try block(s) in frontend/src/tree/model.ts — JSON.parse throws SyntaxError on malformed input; wrap in try-catch
  • medium InputBoundary — frontend/src/api/events.ts — 2 JSON.parse call(s) with 0 try block(s) in frontend/src/api/events.ts — JSON.parse throws SyntaxError on malformed input; wrap in try-catch
  • medium InputBoundary — frontend/src/components/alphaMetrics.tsx — 1 JSON.parse call(s) with 0 try block(s) in frontend/src/components/alphaMetrics.tsx — JSON.parse throws SyntaxError on malformed input; wrap in try-catch
pons asinorum: 10 finding(s)
  • medium string-concat-in-loop — ./frontend/src/tree/model.ts:122 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/model.ts:118 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:69 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:66 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:61 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:53 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:43 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium string-concat-in-loop — ./frontend/src/tree/TreeShapes.tsx:42 — string built by repeated concatenation in a loop (T0, HEURISTIC)
  • medium unreachable-after-jump — ./frontend/src/figure/PaneEditor.tsx:45 — statement is unreachable after an unconditional jump (T0, HEURISTIC)
  • medium unreachable-after-jump — ./frontend/src/components/PublicationTablesPanel.tsx:208 — statement is unreachable after an unconditional jump (T0, HEURISTIC)
rhodibot (RSR compliance): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
panicbot (panic recovery, error handling): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
echidnabot (formal verification: proofs/): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
seambot (integration health: API routes): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
finishingbot (release readiness): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
accessibilitybot (WCAG on the React UI): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
glambot (presentation quality): not_run — enrolled, but no report-back was received
  • 🟠 indeterminate: enrolled, but no report-back was received
cipherbot: not_applicable — no cryptography is implemented in this repository
  • ⚪ not applicable: no cryptography is implemented in this repository
sustainabot: not_applicable — fleet adapter slot reserved; no adapter exists yet (gitbot-fleet README)
  • ⚪ not applicable: fleet adapter slot reserved; no adapter exists yet (gitbot-fleet README)

Scope: static findings reported by each row's tool at the named commit. Purple, red, yellow and blue grade the worst finding present; orange is evidence missing, malformed or a scanner that did not run; grey is an explicit scope exclusion with its reason. No row is a security certification. report.json, badge.json and the raw findings are in the verdict-grid artifact on the linked run.

… handling

`ROADMAP.md` still said that `nb_glm` and `clr_welch` "remain the existing
differential methods", which stopped being true when `zinb`, `hurdle_nb`,
`ancom_bc`, `aldex2`, `songbird`, `multinomial` and `dirichlet_multinomial`
landed. It now lists all nine and points at the README section, and records
that `songbird` (R) and `multinomial` (Julia) are two implementations of one
baseline-category model rather than two models.

The zero-handling note explained why a negative-binomial likelihood needs no
replacement but said nothing about the two joint multinomial models, whose
"when not to replace zeros" advice now names them: a zero count is part of the
likelihood, no size factor is fitted, and conditioning on each sample's read
total makes every effect a log ratio against a reference taxon.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@hyperpolymath
hyperpolymath force-pushed the arena/0ff97d53-metamanifold-webui branch from b1022be to a840c5e Compare October 23, 2026 00:48
@hyperpolymath
hyperpolymath merged commit 7bb716d into main Oct 23, 2026
16 checks passed
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath deleted the arena/0ff97d53-metamanifold-webui branch October 23, 2026 00:48
hyperpolymath added a commit that referenced this pull request Oct 23, 2026
#220)

Removes the React Evidence surface and keeps the Evidence API, per the
owner's ruling on #7: the semantics belong to the theory track, and the
browser implementation is being rewritten for the Vue/Marid client, so
the React one should not sit in the tree in the meantime.

## What goes

| Path | Lines |
| --- | --- |
| `frontend/src/evidence/` (10 files) | 2401 |
| `frontend/src/components/EvidenceModeToggle.tsx` | 21 |
| `api.evidence` namespace in `frontend/src/api/client.ts` | 31 |
| `evidence` tab in `RunView.tsx` | — |

## What stays

`src/core/evidence.jl`, `src/server/routes/evidence.jl`,
`test/unit/test_evidence.jl`, `test/unit/test_evidence_routes.jl`. The
claim schema (scope 1–50 values ≤200 chars, text ≤2000, ≤5 warrants, ≤20
caveats, blank status → `draft`, `supported` requires ≥1 of
measurement/citation/inference), the echo verdicts, containment labels
and residual arithmetic are untouched and still covered by the Julia
suite.

## Side effect on #7's actual complaint

`EvidenceModeToggle` gated the placement `CladeCumulusPanel` in the
Trees view — "Evidence Mode currently gates Advanced and CladeCumulus".
With the toggle gone that panel renders unconditionally, so the gating
the issue describes no longer exists.

## Contract for the Marid client

The README `### Evidence Mode (API)` section now documents the endpoints
and the server-enforced validation rules instead of the three removed
views.

## Verification

- `tsc --noEmit -p .` — clean
- 10 remaining frontend test files — 169 assertions, 0 failures
- `vite build` — succeeds

The deleted `evidence.test.ts` covered the UI claim helpers; the rules
it mirrored stay tested on the server. This branch is also rebased onto
current `main`, and replaces #212 (closed as superseded — every repair
it carried landed on `main` via #208–#216).

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant