Skip to content

Validation/issue 23 native da - #70

Open
hyperpolymath wants to merge 16 commits into
JoshuaJewell:mainfrom
hyperpolymath:validation/issue-23-native-da
Open

hyperpolymath wants to merge 16 commits into
JoshuaJewell:mainfrom
hyperpolymath:validation/issue-23-native-da

Conversation

@hyperpolymath

Copy link
Copy Markdown
Contributor

Change and reason

Validation

Scope

Contribution checks

  • I followed CONTRIBUTING.md.
  • This branch starts at current upstream main and contains no merges from fork main.
  • Every commit is signed and shows as Verified.
  • CI has run and passes.
  • Existing licensing, citation and acknowledgement text is unchanged.

Validate the existing differential route and tab with a local CompositionalDA development checkout in CI. This branch is not an upstream integration candidate: registration and a registry-resolved Manifest are still required. No renv.lock change.
Use the checksummed Julia archive and GitHub cache without changing the action allowlist. Preserve the full test suite and assert bootstrap pin equivalence; omit only fork coverage upload. Export all ALDEx2 statistics in the CSV.
Use the checksummed Julia archive and GitHub cache without changing the action allowlist. Preserve the full test suite and assert bootstrap pin equivalence; omit only fork coverage upload. Export all ALDEx2 statistics in the CSV.
Run the complete pinned WebUI suite against CompositionalDA 480b10b. This is a fork-only development dependency pending registration.
Show the natural-log estimate alongside its natural-log standard error. Refuse out-of-range integer conversions explicitly, with BigInt and Float64 regression cases.
Run the complete pinned WebUI suite against CompositionalDA bf84ba0, including the reference-compatible variance classes and their tie handling.
Validate the audited package candidate, seed and Monte Carlo bounds, malformed route methods, and CSV round trips including the documented R reader.
Pin the completed rereview candidate and require the three-taxon ANCOM-BC request to return the documented 422 refusal.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ❌ Failed

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

Review Status Commit Review trigger
📝 Code Review ❌ Failed 2026-11-10T19:56:23.335360Z
We couldn’t complete this review. Comment @codex review to try again.
1832f5c New commits
ℹ️ 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.

hyperpolymath and others added 2 commits November 7, 2026 20:09
The branch had narrowed the upstream workflow to fit a fork-local candidate:
a push trigger naming this branch, a hand-rolled Julia bootstrap replacing the
pinned setup action, a private package checkout developed into the project, and
coverage upload removed. None of that can be proposed upstream, and removing
coverage is what cost this branch its patch report.

The workflow is now identical to upstream main. The native methods need the
CompositionalDA package, which is not in the General registry yet: Project.toml
names it and the resolved Manifest entry has to arrive with its registration,
so the module loads without it and the two methods that need it refuse by name.
test/unit/test_differential_native.jl also needs that package to run; the
dependency and its resolved Manifest are the outstanding step for this PR.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@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.

hyperpolymath and others added 4 commits November 8, 2026 01:34
`Pkg.instantiate()` failed in CI ("Julia tests": Instantiate Julia project),
so nothing downstream of it ran. `Project.toml` declared `CompositionalDA`,
which is not in the General registry and has no Manifest entry to resolve
against: the declaration alone is enough to make resolution fail for every
checkout, CI included.

The module already imports the package opportunistically, so the declaration is
what has to go. It is replaced by a note in `Project.toml` recording why it is
absent and what has to arrive with it (the dependency, its `[compat]` bound and
the regenerated `Manifest.toml`, in one change) once it is registered.

`compositional_da_available()` is exported so callers and tests can ask the
question the guard answers, and the refusal message now says where the package
comes from instead of pointing at a `Project.toml` entry that no longer exists.
The input checks (retained taxa, Int range) now run before the dependency
probe, so a malformed matrix is refused for that reason whether or not the
package is installed.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
`test_differential_native.jl` began with `import CompositionalDA`, so the unit
suite could not load at all without a package CI cannot install, and the route
test in `test_differential.jl` asserted a 200 from a method that could not run.

Both now branch on `compositional_da_available()`:

- The configuration boundary fuzz, the oversize-count refusal and the
  constructor errors run everywhere.
- Without the package, the refusal is what is tested: both native methods raise
  an `ArgumentError` naming `CompositionalDA` and pointing at `nb_glm`, and the
  route answers 400 `invalid_input` with that message rather than a 500 or a
  table of numbers no model produced.
- With the package developed into the environment, the adapter and ANCOM-BC
  comparisons run unchanged against it.

The skips announce themselves (`@info`) the way the R- and glmGamPoi-dependent
testsets in this file already do, so a silent gap is visible in the log.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
The web-interface guide listed only `nb_glm` and `clr_welch`, so `aldex2` and
`ancombc` were reachable through config and the UI without being described. It
now names both, says what they compute and which settings drive them
(`mc_samples`, `seed`), and states up front that they need `CompositionalDA`,
which is not installable yet, so the two methods refuse by name until it is
developed into the environment.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…instantiate (#314)

## Change and reason

`Julia tests` was failing on #70 at **Instantiate Julia project**, so
every step after it — RCall, the suite, coverage — was skipped. The
cause is a single declaration:

`Project.toml` named `CompositionalDA` (`bb1787b7-…`) in `[deps]` and
`[compat]`, but the package is **not in the General registry** and there
is no `Manifest.toml` entry to resolve it against. `Pkg.instantiate()`
therefore cannot resolve the project and exits 1 on *every* checkout, CI
included — before any test runs.

The module already imports the package opportunistically
(`_COMPOSITIONAL_DA_AVAILABLE`), so the declaration is the only thing
that has to go. This PR removes it and keeps the feature intact behind
that guard:

- **`Project.toml`** — the declaration is gone, replaced by a comment
recording why it is absent and what must land together when it is
registered (dependency + `[compat]` bound + regenerated `Manifest.toml`,
in one change).
- **`src/analysis/differential.jl`** — the refusal message no longer
points at a `Project.toml` entry that no longer exists;
`compositional_da_available()` is exported so callers (and tests) can
ask the question the guard answers; the input checks (retained taxa,
`Int` range) now run *before* the dependency probe, so a malformed
matrix is refused for that reason whether or not the package is
installed, on every machine.
- **tests** — `test_differential_native.jl` began with `import
CompositionalDA`, so the unit suite could not load at all without a
package CI cannot install. Both native test files now branch on
`compositional_da_available()`: the boundary fuzz, the oversize refusal
and the constructor checks always run; without the package the *refusal*
is what is asserted (both methods raise `ArgumentError` naming
`CompositionalDA`, the route answers 400 `invalid_input` rather than a
500 or a table no model produced); with the package developed into the
environment the adapter and ANCOM-BC comparisons run unchanged. Skips
announce themselves with `@info`, like the existing R- and
glmGamPoi-gated testsets.
- **`docs/guide/web-interface.md`** — documents `aldex2`/`ancombc`,
`mc_samples`/`seed`, and the package caveat the guide was missing.

No application logic changes: the estimators, their settings and their
results are untouched.

## Validation

The fork's action policy blocks `julia-actions/*` (verified: the
dispatch fails with *"…are not allowed in
hyperpolymath/MetaManifold-WebUI because all actions must be from a
repository owned by hyperpolymath, created by GitHub, verified in the
GitHub Marketplace…"*), so upstream's `ci.yml` cannot start here. The
change was validated with a throwaway policy-compliant job on the same
commit that reproduced the two steps that matter:

- **`Pkg.instantiate()`** — `success` (this is the step that failed in
#70). Julia 1.12.5, R installed, RCall rebuilt against it.
- **`julia --project=. test/runtests.jl test_differential
test_differential_native`** — `success`: **1013 passed, 0 failed, 18
skipped (`@test_skip`)**.
  - `Native configuration boundary fuzz` — 790
  - `Native input boundaries do not depend on the package` — 5
  - `Native methods refuse by name when the package is absent` — 8
- `Route: native method override and input refusal` — 16 (1 skipped: the
adapter half)
- `Native compositional DA adapter`, `ANCOM-BC adapter…` — skipped,
package absent

The throwaway job did not restore `renv`, so `glmGamPoi` was absent;
those five testsets fail by contract under `CI=true` when glmGamPoi is
missing (issue #37), so the job ran with `CI=false` to have them skip
loudly. In real CI they run — `renv.lock` installs glmGamPoi.

Frontend gates were run locally on this branch: `bun install
--frozen-lockfile`, `bun run build` and `bun test src` (68 pass, 1 skip,
0 fail).

**Not run here:** the full CI job (DADA2/PR2/R suite, Agda, Codecov).
Nothing in this diff touches them.

## Scope

Follow-up, deliberately out of scope: activating the native methods for
real. That needs either `CompositionalDA` registered in the General
registry, or a `[sources]` git dependency — either way with the
regenerated `Manifest.toml` in the same change. Until then
`aldex2`/`ancombc` are wired, documented and refused by name.

Lockfiles: `Manifest.toml` and `renv.lock` are untouched; `bun.lock` is
untouched.

## Contribution checks

- [x] I followed
[CONTRIBUTING.md](https://github.com/JoshuaJewell/MetaManifold-WebUI/blob/main/CONTRIBUTING.md).
- [x] This branch starts at current upstream main and contains no merges
from fork main.
- [x] Every commit is signed and shows as Verified.
- [ ] CI has run and passes — it has not run yet: this branch is based
on `validation/issue-23-native-da`, not `main`, so `ci.yml`'s
`pull_request: branches: [main]` does not trigger. Merging this into
#70's branch and re-running there is the intended path.
- [x] Existing licensing, citation and acknowledgement text is
unchanged.
@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.

@codecov

codecov Bot commented Nov 8, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

… (closes the 30 uncovered lines on upstream PR 70) (#319)

## Change and reason

Codecov reported 52.38% patch coverage on
[JoshuaJewell#70](JoshuaJewell#70),
with 30 lines missing. All 30 lines are in
`src/analysis/differential.jl`. They are the adapter that turns a
CompositionalDA result into result rows.

The cause is real. CompositionalDA is not in the General registry, so CI
cannot install it. In CI, only the refusal path ran.

This change makes the adapter reachable in CI:

- `differential_abundance(...; native_backend=nothing)` calls a module.
The default is the `CompositionalDA` that the session loaded, or the
by-name refusal when the session loaded none. Production behaviour does
not change.
- `_is_composition_error` translates the `CompositionError` of the
backend in use.
- `diagnostics.native_method.package` reports the name of the module
that produced the numbers. A record from the stand-in says
`NativeDAStub`, so it cannot read as a record from the package.
- `test/support/native_da_stub.jl` is a stand-in with the two entry
points, the column names and the verdict strings of the package. Its
`qvalue` is not `bh_adjust(pvalue)`, so a second BH pass is visible. Its
structural rows carry NaN, as the package leaves them.
- `test/unit/test_differential_native.jl` gains four testsets that run
on every checkout: the seam, the ALDEx2 wiring, the ANCOM-BC wiring and
the refusal order.

The comparisons against the real package stay. They still skip with a
message when the package is absent.

This pull request targets the branch of upstream PR 70. A merge here
updates that pull request.

## Validation

Julia 1.12.5, R 4.3.3 (Ubuntu 24.04 `r-base-core`), all commands from
the repository root.

1. Coverage, with the same flags as CI:

   ```bash
julia --project=. --code-coverage=user --compiled-modules=no
test/runtests.jl differential differential_native
   ```

Result: 1159 pass, 13 skipped, 0 fail. I compared the `.cov` file with
`git diff` against the merge base with upstream `main` (`89be534`).
Every instrumented line that this branch adds to
`src/analysis/differential.jl` is covered: 52 of 52.

2. Real package. In a scratch copy I ran `Pkg.develop` on
`hyperpolymath/CompositionalDA.jl` at `9903e76` (v0.3.0) and ran the
same command. Result: 1367 pass, 11 skipped, 0 fail. The two
real-package testsets ran and agreed with the adapter.

3. Full unit suite: `julia --project=. -t 2 test/runtests.jl`. Result:
3618 pass, 25 skipped, 1 error. The error is `test_provenance.jl:479`:
"package 'dada2' is not installed in the R library in use". My sandbox
does not have the R packages that `renv.lock` installs in CI. The test
does not touch this change.

4. Planted mutants. I run 12 deliberate corruptions of the adapter
against `test/runtests.jl differential_native`. The run is in progress.
I will add the result here before I mark this pull request ready.

Not run: the integration tests, the server tests, the frontend tests,
and the upstream CI itself. Codecov runs on the upstream pull request
only, so the Codecov number is not confirmed until PR 70 runs again.

## Scope

- No change to `Project.toml`, `Manifest.toml`, `renv.lock`,
`codecov.yml` or any workflow.
- The stand-in tests the wiring of the adapter. It does not test the
estimators. The real-package testsets do that, where the package is
installed.
- An earlier draft of this work also proposed a patch-coverage gate, a
sensitivity test and three estate workflows for the upstream repository.
I left them out. They are separate decisions for the upstream owner.

## Contribution checks

- [x] I followed
[CONTRIBUTING.md](https://github.com/JoshuaJewell/MetaManifold-WebUI/blob/main/CONTRIBUTING.md).
- [x] This branch starts at current upstream main and contains no merges
from fork main. (It starts at the head of PR 70, `be7792f`.)
- [ ] Every commit is signed and shows as Verified. (The managed signing
identity decides this. See the commit badge.)
- [ ] CI has run and passes. (Pending.)
- [x] Existing licensing, citation and acknowledgement text is
unchanged.

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

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@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.

hyperpolymath added a commit to metadatastician/MetaManifold-Evidence that referenced this pull request Nov 10, 2026
## What this changes

The notes for upstream
[JoshuaJewell/MetaManifold-WebUI#70](JoshuaJewell/MetaManifold-WebUI#70)
said that the two patches were never run. That is no longer true for the
first patch.

- `notes/0004-pr70-native-adapter-test-seam.patch` is now the commit
that was run and pushed: `3ed1dfb`, open as draft
[hyperpolymath/MetaManifold-WebUI#319](hyperpolymath/MetaManifold-WebUI#319).
- `notes/pr70-coverage-and-cicd.md` has a new status section at the top.
It records the measured results, the changes against the first draft,
and why PR 70 has no Codex review and no governance comment.
- `notes/README.md` marks
`0005-pr70-coverage-gates-and-estate-lanes.patch` as not applied, never
run, and stale against the new `0004`.
- The word `ponsbot` is corrected. No such fleet member exists in
gitbot-fleet or in standards. pons asinorum is a built-in row of the
Hypatia grid.

## Measured results recorded in the note

| check | result |
| --- | --- |
| patch line coverage of `src/analysis/differential.jl`, CI flags | 52
of 52 added lines covered |
| real CompositionalDA v0.3.0 developed into a scratch copy | 1367 pass,
11 skipped |
| full unit suite | 3618 pass, 25 skipped, 1 error (needs the R package
`dada2`, absent in the sandbox) |
| planted mutants | 12 of 12 killed |

## Not changed

The `0005` patch file itself. It stays as the record of the first draft.

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

Co-authored-by: Claude <noreply@anthropic.com>
hyperpolymath added a commit to metadatastician/MetaManifold-Evidence that referenced this pull request Nov 10, 2026
…verage (#17)

## What this changes

Follow-up to
[#16](#16).
That note said the WebUI change was open as a draft. The change is now
merged, and the upstream result is known.

- `notes/pr70-coverage-and-cicd.md`:
[hyperpolymath/MetaManifold-WebUI#319](hyperpolymath/MetaManifold-WebUI#319)
is merged. The head of upstream
[JoshuaJewell/MetaManifold-WebUI#70](JoshuaJewell/MetaManifold-WebUI#70)
is `1832f5c`.
- The upstream `CI` run passed at that head.
- Codecov reports patch coverage 100% (66 of 66 lines, 0 missing; it was
33 of 63) and project coverage 75.88% (base 75.73%). Source: the public
Codecov API for PR 70, read at 2026-11-10 20:25 UTC.
- `notes/README.md`: the index row for the `0004` patch says the same.

Two files change. No patch file changes.

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

Co-authored-by: Claude <noreply@anthropic.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