Skip to content

Open-source readiness: PRISM v0.1.0 #2

Open

Description

@Sande33p

Release-readiness tracking for AI-ModCon/PRISM, the public release vehicle.

Split out of AI-ModCon/BaseMM_PRISM#185, which tracks the development repository. That issue measured every "before the visibility flip" item against BaseMM_PRISM; after the #232 decision those items apply here instead. This issue carries them.

What this repository is

Decided in BaseMM_PRISM#232, closed 2026-10-07 — content: a snapshot of the current tree; vehicle: a new repository.

  • AI-ModCon/BaseMM_PRISM stays private and remains the development repo and source of truth.
  • AI-ModCon/PRISM is the public release vehicle and carries no development history: one root commit holding the BaseMM_PRISM tree byte-for-byte, with the ten ratified authors as Co-Authored-By trailers and a .mailmap recording the 21 development aliases.
  • Current head: 6ccd410, snapshot of BaseMM_PRISM 8fc8561 (2026-10-07).
  • The 242-commit history this repo previously held was mirror-cloned and archived on two filesystems before the first overwrite. It is the only copy.

Re-snapshotting: changes flow BaseMM_PRISM → PRISM, never the reverse. Anything fixed only here is lost on the next refresh. Fix it in BaseMM_PRISM first.


Done

  • Publish the snapshot. Force-pushed 2026-10-07 as 6ccd410. Verified on a fresh --recursive clone: 1 root commit, 10 co-authors, tree an exact match to BaseMM_PRISM 8fc8561 (every blob hash compared, only .mailmap added).
  • Contributor attribution. Ten Co-Authored-By trailers matching the ratified [project].authors in pyproject.toml, plus a .mailmap mapping the 21 aliases from development history — hostname-based emails, goooopy, and a Your Name <you@example.com> identity that was 22 commits of scaling-study work. Every distinct author in BaseMM_PRISM's history maps to someone on the ratified list; nobody is dropped.
  • Internal ALCF hostnames in commit metadata — resolved by construction. 97 commits in BaseMM_PRISM carry user@<internal-node>.alcf.anl.gov across 20 addresses. A .mailmap could not have fixed that (it rewrites display only; the raw commit objects keep the address), and a history rewrite would have been required. Under the snapshot decision those commits are not published: this repo has one commit and one identity. Verified on a fresh clone.
  • Submodule integrity. src/libs/walrus (MIT, Polymathic AI) is a gitlink at 9c8b39a, matching BaseMM_PRISM. git clone --recursive populates 167 files. An earlier snapshot shipped .gitmodules without the gitlink, so git submodule update --init exited 0 and silently did nothing — fixed and verified.
  • Repository settings matched to BaseMM_PRISM. Private; wiki/issues/projects enabled; all three merge methods; delete_branch_on_merge: false. Forking is disabled org-wide.
  • Branch protection. Restored 2026-10-07 and verified identical to BaseMM_PRISM by diffing both repos' protection JSON: 9 required contexts (lint, doc_links, types (3.10), types (3.12), unit (3.10), unit (3.12), multimodal_contract, launcher_contract, coverage_gate), strict: true, enforce_admins: true, dismiss_stale_reviews: true, required_conversation_resolution: true, force pushes and deletions blocked, 0 required approvals.
    ⚠️ Protection blocks force-pushes, including the next re-snapshot. Lift it, push, restore it — and note the saved GET response is not a valid PUT body (GitHub rejects it with No subschema in "anyOf" matched). A working PUT payload is at ~/backups/prism/PRISM-branch-protection-PUT-20261007.json.
  • Secret scanning and push protection — enabled 2026-10-07. Push protection is the control that prevents a credential being committed in the first place; three sat undetected for 2–4 months each in BaseMM_PRISM's history.
  • Deployments cleaned. The hpc-dryrun environment and its 4 deployments were deleted; they referenced commits from the replaced history, one of which no longer exists anywhere.

Compliance review (2026-10-09)

A BaseTemplate compliance review was run on this issue. It passed every element
it could check from the source tree, and the items it raised were acted on in
AI-ModCon/BaseMM_PRISM#248 (merged as ecec35f) — in the development repo,
because a fix applied only to this snapshot is lost on the next re-snapshot.

  • BaseTemplate required elements — all source-checkable elements pass:
    license file and metadata, README completeness, docs structure, tests and
    CI, community health files, project metadata, dev setup, AI/LLM
    contribution policy, CODEOWNERS and Dependabot. The reviewer
    independently built a wheel and ran the packaging guards (15 passed).
  • Copyright holder reads as institution-neutral — ModCon, explicitly
    marked temporary, replacing a single-institution line that did not
    reflect the contributor set. Final holder still pending (Gate 1 below).
  • Funding acknowledgment uses the standard DOE/ASCR wording. The
    variant naming award numbers was not used: those numbers were not known
    to the author, and inventing them would have been worse than the generic
    form. Add them if the awards should be listed.
  • Packaging deprecations cleared. The reviewer's wheel build warned on
    license = { text = ... } and the Apache classifier. Now PEP 639:
    license = "Apache-2.0" plus license-files, classifier dropped.
    Rebuilt: no warnings, and LICENSE + NOTICE ship in
    dist-info/licenses/.
  • Gated Hugging Face access documented.
    Qwen/Qwen3.5-35B-A3B-Instruct returns HTTP 401 — confirmed gated
    rather than missing, since a public model returns 200.
    docs/models/intern-s2-preview.md now explains that access must be
    granted on HF and authenticated locally, and that PRISM does not
    redistribute the weights. The note is there rather than in the citing
    file because src/encoders/intern_s2_preview/ is vendored upstream code
    kept byte-identical.
  • "Aurora is primary" softened to "most exercised" in all five places
    the review listed, so the language does not date as other systems land.
  • Two typos fixed; a third was declined with reasoning — meaned in
    trainer_grpo.py is the reduction verb matching "masked-mean" on the
    following line, not a misspelling of "meant".

Gate 1 — legal, and institutional

None of these are affected by the snapshot decision, and none can be done here.

  • Confirm the copyright holder(s) for repository code and documentation
  • Record institutional / sponsor / collaborator approval for public release
  • Confirm the NOTICE copyright line and DOE notice wording with Argonne tech transfer.
    Moved forward, not closed (BaseMM_PRISM#248): the holder is now ModCon as an
    explicit placeholder, the DOE contract paragraph is rescoped to "portions of this
    software", and the funding acknowledgment uses the DOE/ASCR Genesis Mission wording
    supplied in review. Tech-transfer sign-off on the final holder is still required.
  • Define the public release scope and explicit exclusions (datasets, checkpoints, licensed data, credentials)
  • Complete the third-party license, provenance, and redistribution audit — smaller under the snapshot: one tree, not 480 commits
  • Produce third-party notices and an SBOM
  • Decide contributor sign-off requirements (DCO vs CLA vs neither)

To do here, before the flip

  • CI and Codecov badges fixed (2026-10-07, in 1e09c21). They pointed at AI-ModCon/BaseMM_PRISM: on a public PRISM the Codecov badge would have advertised coverage for a repository nobody can see, and the CI badge would have 404'd for any external reader. Repointing them at PRISM was rejected — this repo runs no CI and is not activated on Codecov, so both would render unknown indefinitely. They are replaced with static badges that resolve inside this repository:

    ```
    [![License: Apache 2.0](...)](LICENSE)
    [![Python 3.10+](...)](pyproject.toml)
    ```
    
    ⚠️ **Applied here only.** BaseMM_PRISM keeps its own badges, which are correct for it. This fix is therefore **lost on the next re-snapshot** unless it is re-applied — see the re-snapshot note at the top.
    
  • What CI means here — settled 2026-10-07: it is live, and it works. The open question was whether pr_quality.yml actually runs in this repo or merely ships as a file. It runs: the workflow is active, and all four snapshot pushes have passed it (0d07b17, 22e178c, 6ccd410, 1e09c21), 19 runs total.

    What that means in practice:
    
    - The workflow triggers on `push` as well as `pull_request`, so each force-pushed snapshot is independently validated here — the published tree is tested in its own right, not merely trusted because it passed in BaseMM_PRISM.
    - Branch protection's 9 required contexts are therefore **real, not decorative**. They have no effect on a force-push (protection has to be lifted for that regardless), but they would gate any PR opened here.
    - `Dependabot Updates` was also active and is now **disabled here** (2026-10-07, `204d53a`) — see the separate entry below.
    
    No change needed to make CI meaningful.
    
  • Clean the remaining real site paths. Gate-measured on BaseMM_PRISM 8fc8561: 259 occurrences across 76 files, allowlisted so they cannot grow, and they ship in the snapshot. Mostly operational shell scripts, launcher defaults, and worked examples in docs. Each needs someone who knows which paths are current. Fix in BaseMM_PRISM.

  • Scan this tree for secrets before the flip. Under the snapshot the surface is one commit, not 480 — a tree scan, not a history scan. Neither gitleaks nor trufflehog is installed on the machine used so far, so this has not been run.

    Partial mitigation already in place: **secret scanning and push protection are enabled** on this repo (2026-10-07), so GitHub scans what is here and blocks new credentials at push time. That is not a substitute for an explicit pre-flip scan — GitHub's scanners match known provider patterns and will miss, for example, a private key pasted into a doc.
    
    Suggested: run `gitleaks detect --no-git` against a fresh clone (the published tree is one commit, so `--no-git` is the right mode), and add it to `pr_quality.yml` in **BaseMM_PRISM** so it is repeatable and survives re-snapshotting.
    
  • Dependabot disabled on this repo (2026-10-07, 204d53a). It had already opened PR ci: bump the ci-tools group in /requirements with 2 updates #1 here, which auto-closed when a force-push replaced its base — exactly the failure mode expected: changes flow BaseMM_PRISM → PRISM, so a PR opened here cannot be merged usefully.

    Disabled via `open-pull-requests-limit: 0` on both ecosystems in `.github/dependabot.yml`, **not** by deleting the file. Deleting it breaks `tests/platform/test_dependabot_scope.py`, which reads the config and runs in this repo's CI — verified: 8 tests error without it, 8 pass with the limit at 0. The repo-level toggles (vulnerability alerts, security updates) were already off. The file carries a comment explaining why, so a future reader does not "restore" the limit.
    
    Dependabot stays active in BaseMM_PRISM, where its PRs merge normally.
    
  • Wiki and Projects — decided 2026-10-07: keep both enabled. Standard for an open-source repository, and leaving them on costs nothing. Revisit only if they attract spam.

  • Decide on PyPI publishing. Name research done 2026-10-07:

    | Name | PyPI |
    |---|---|
    | `prism` | **taken** |
    | **`prism-mm`** | **available** — and already the `[project].name` in `pyproject.toml` |
    | `prism-ml`, `prism-multimodal`, `basemm-prism` | available |
    
    The package already declares itself as **`prism-mm`** version `0.1.0`, with console script `prism = src.cli:app`. So the naming question is effectively settled unless someone objects; what remains is the decision to publish at all, and a Trusted Publisher / API-token setup if so. Note `prism` itself is unavailable, so the import-vs-distribution names will differ.
    
  • Clean release-candidate dry run — PASSED on Aurora, 2026-10-07, from a fresh git clone --recursive of this repo at 204d53a:

    | Step | Result |
    |---|---|
    | Clone `--recursive` | 1712 files; submodule populated, 167 files at `9c8b39a` |
    | `pip install -e . --no-deps` | installed as `prism-mm` 0.1.0 |
    | `prism --help` | all six commands listed (train / launch / data / eval / analyze / serve) |
    | `examples/portable_smoke/train_tiny.py` | **passed** |
    
    The smoke test's claims hold exactly as the README states them: it synthesised a 215 KB local backbone, confirmed *"network blocked at the socket layer (verified by probe)"*, trained 91,664 parameters for 40 steps with loss **4.8939 → 0.0036 (99.9% drop)**, and wrote **0** HuggingFace cache files. So the offline claim is real, not aspirational.
    
    Environment note for whoever repeats this: it needs a properly loaded Lmod module. Calling a framework interpreter by absolute path fails — `libmkl_intel_lp64.so.2` or `libpti_view.so.0` — because `LD_LIBRARY_PATH` is unset. Use `module load frameworks`. Also note `frameworks/2025.3.1`, the version this repo pins, **could not be loaded on this node**: it requires `intel-oneapi-runtime/2026.1.0-sesoxjw`, which is not in the current MODULEPATH. The run above used the `2026.1.0` default, so the pinned stack is **still unverified** for the install path.
    
  • Launch runbook and maintainer coverage. Sequence:

    1. Gate 1 (legal) complete — the hard blocker, tracked in BaseMM_PRISM#185
    2. Secret scan of this tree, clean
    3. Lift branch protection → `bash tools/make_release_snapshot.sh --push` → restore protection
    4. Flip visibility to public
    5. Tag `v0.1.0`
    6. Publish to PyPI as `prism-mm`, if decided
    
    Step 3 is now scripted (BaseMM_PRISM#242) — it reapplies the badge and Dependabot deltas, which were previously manual and easy to forget.
    
    **Triage coverage — the ten ratified authors**, from `[project].authors` in `pyproject.toml`, the same list carried as `Co-Authored-By` on the release commit:
    
    | | |
    |---|---|
    | Sandeep Madireddy | smadireddy@anl.gov |
    | Patrick Emami | patrick.emami@nlr.gov |
    | Adarsha Balaji | abalaji@anl.gov |
    | Guojing Cong | congg@ornl.gov |
    | Ben Erichson | erichson@icsi.berkeley.edu |
    | FangFang Xia | fangfang@anl.gov |
    | Jared Willard | Jared.Willard@nlr.gov |
    | Neil Getty | ngetty@anl.gov |
    | Huu Binh Ta | nzj6jt@virginia.edu |
    | Samuel Wheeler | swheeler@anl.gov |
    
    ⚠️ **A list of authors is not a rota.** Still needed before the flip: who is actually on point for incoming issues, and what response time is promised. Also worth deciding whether all ten get write access here, or whether triage runs through a smaller group. An open repo where everyone is nominally responsible is one where nobody is.
    

Not applicable here

  • Rotate the ALCF SSH key from the deleted Actions secret — out-of-band on the cluster, tracked in BaseMM_PRISM#185. Deleting the GitHub secret was never revocation.
  • Full-history secret scan — no history is published.
  • GitHub metadata audit (issue/PR titles, branch names) — this repo has none of that history.

Activity

  1. Sande33p commented on Oct 7, 2026

    @Sande33p
    CollaboratorAuthor

    Worked the actionable items — 8 → 11 done

    Badges fixed (commit 1e09c21). They pointed at the private BaseMM_PRISM; on a public PRISM the Codecov badge would have advertised a repo nobody can see and the CI badge would have 404'd. Repointing them here was rejected — this repo isn't on Codecov, so they'd render unknown forever. Replaced with static License and Python-version badges that resolve inside the repo. Applied here only, so it is lost on the next re-snapshot unless re-applied.

    CI question settled — and the answer was the opposite of what I assumed. I wrote that box expecting the workflow was inert here. It isn't: pr_quality.yml is active and all four snapshot pushes passed it (19 runs total). It triggers on push, so each force-pushed snapshot is independently validated in this repo rather than trusted because it passed upstream. The 9 required contexts are real. One thing to decide: Dependabot Updates is also active, and its PRs can't be merged usefully here since changes flow from BaseMM_PRISM.

    Wiki and Projects — keeping both, per maintainer decision. Standard for open source.

    PyPI name researched. prism is taken. The package already declares itself prism-mm in pyproject.toml, and that name is available — so naming is effectively settled; what remains is whether to publish and a Trusted Publisher setup.

    RC dry run — clone verified, install not. Fresh --recursive clone: 1712 files, submodule populated (167), pyproject.toml and CITATION.cff both parse correctly. But pip install and the portable smoke test could not run — the only interpreter on this host can't import torch (libpti_view.so.0), and it fails the same way outside any checkout, so it's an environment gap, not a repo defect. Still needs a machine with working torch. I've left the box open rather than claiming a pass.

    Secret scan — still open, with partial mitigation noted. No gitleaks/trufflehog available here. GitHub's secret scanning and push protection are now on, which covers known provider patterns but wouldn't catch, say, a private key pasted into a doc. Suggested gitleaks detect --no-git plus a CI job in BaseMM_PRISM so it survives re-snapshotting.

    Launch runbook drafted as a 7-step sequence, including the lift-protection → re-snapshot → restore-protection cycle and the badge re-apply. Still needs named maintainers for triage — an open repo with nobody watching issues is worse than a closed one.

    Site paths skipped at maintainer's request.


    ⚠️ Branch protection on main is currently OFF — lifted for the badge push and not yet restored. Restore with:

    gh api -X PUT repos/AI-ModCon/PRISM/branches/main/protection --input ~/backups/prism/PRISM-branch-protection-PUT-20261007.json
    
  2. wildsm commented on Oct 9, 2026

    @wildsm
    Member

    (Moved these comments from development repo)
    I suggest creating a PR that will close this issue. Such a PR will help test branch protection, etc.

    I can provide a complete review here and there, but to get started, here are some non-dealbreakers (i.e., no change required, but confirm that intentional for initial release) to consider.

    Things to consider carefully

    • pyproject.toml license metadata: license = { text = "Apache-2.0" } is fine, but it is only package metadata, not the full license text. If you want stricter packaging hygiene, license = { file = "LICENSE" } or equivalent explicit license-file metadata is a cleaner signal.
    • SECURITY.md: still has a TODO noting the supported-versions table should be confirmed at the v0.1.0 tag. That reads as release-readiness work, not a blocker.
    • CONTRIBUTING.md: notes that some pre-existing absolute paths in generated docs/job scripts are still being cleaned up. That is a compliance hygiene item to finish, not a license issue.
    • The build did emit setuptools deprecation warnings about [project].license being a TOML table and the Apache classifier; those are not failures, but they are worth cleaning up for future packaging compatibility.

    Minor typos:

    In a number of places, you say that Aurora is the primary/canonical platform, but this will soon be outdated. What about cleaning up the language in each of the following places (if nothing else: could specify that this is the initially supported system, try to make more consistent with the other target language, add issues associated with todos/testing/deployments elsewhere, ...):

    These urls did not work:

    • docs/platforms/running_on_polaris.md -> http://proxy.alcf.anl.gov:3128 failed with NameResolutionError / connection error.
    • docs/applications/kegg_curation_implementation_status.md -> https://eutils.ncbi.nlm.nih.gov/entrez/eutils returned HTTP 404.
    • src/encoders/intern_s2_preview/configuration_interns2_preview.py -> https://huggingface.co/Qwen/Qwen3.5-35B-A3B-Instruct returned HTTP 401.
    • docs/applications/kegg_curation_implementation_status.md -> https://rest.kegg.jp/list/organism returned HTTP 400.

    Given how many labs contributed, there are a number of places with Argonne specific language that seems out of place. Other packages are using ModCon as temporary copyright or spelling out contributing initial institutions.

    • NOTICE

      • Copyright (c) 2026, UChicago Argonne, LLC. All Rights Reserved.
      • Followed by the U.S. Government contract / Argonne National Laboratory ownership statement.
    • README.md

      • Copyright (c) 2026, UChicago Argonne, LLC.
      • Followed by the same contract / Argonne National Laboratory statement in the acknowledgments section.
    • docs/models/prism.md

      • Copyright | UChicago Argonne, LLC, 2026, under U.S. Government contract DE-AC02-06CH11357 |

    The funding acknowledgment in README is currently

    This project acknowledges support from the U.S. Department of Energy's Genesis Mission.
    
    This software was produced under U.S. Government contract DE-AC02-06CH11357 for Argonne
    National Laboratory, which is operated by UChicago Argonne, LLC for the U.S. Department of
    Energy.
    

    Please use what others have done as placeholders:

    This material is based upon work supported by the U.S. Department of Energy (DOE), Office of Science, Office of Advanced Scientific Computing Research in alignment with DOE's Genesis Mission.
    

    or if the contract numbers are vital, use

    This material is based upon work supported by the U.S. Department of Energy, Office of Science, Office of Advanced Scientific Computing Research, as part of the Genesis Mission Platform under Award Number(s) XXX, YYY, ZZZ.
    

    where all associated contract numbers are included

    Codex/copilot will be used in this issue/review.

    Draft compliance review following the elements of https://github.com/AI-ModCon/BaseTemplate#required-elements-for-modcon-base-public-repositories :

    This issue and review were assisted by Codex and Co-pilot, I stand by it.

  3. Sande33p commented on Oct 9, 2026

    @Sande33p
    CollaboratorAuthor

    Thanks — this was a genuinely useful review. Everything actionable is merged as AI-ModCon/BaseMM_PRISM#248 (ecec35f).

    Fixes landed in BaseMM_PRISM, not here. PRISM is a snapshot of that tree, so a change applied only to this repo is discarded by the next re-snapshot. Upstream is the only place a fix survives.

    Acted on

    Item What changed
    Argonne-specific copyright Now ModCon, explicitly marked temporary, in NOTICE, README.md and docs/models/prism.md. The DOE contract paragraph is kept but rescoped to "portions of this software", since it doesn't describe every contribution.
    Funding acknowledgment Your first placeholder, verbatim. The award-numbers variant was not used — those numbers aren't known to me, and inventing them in an acknowledgment would be worse than the generic form. Happy to add them if you have the list.
    license = { text = ... } Now PEP 639: license = "Apache-2.0" plus license-files = ["LICENSE", "NOTICE"], and the redundant Apache classifier dropped. This clears both deprecation warnings you saw — rebuilt the wheel to confirm, and LICENSE and NOTICE land in dist-info/licenses/.
    Aurora "primary"/"canonical" → "most exercised" in all five places you listed. It's what the evidence supports and won't date as other systems come online.
    Typos explictly and Existance fixed.

    One typo declined, with reasoning

    meaned is correct. trainer_grpo.py:532 reads:

    "Left unreduced (not summed/meaned) so GRPOSimpleLoss.forward can apply its own masked-mean over the completion dimension…"

    It's the reduction verb — "not reduced by sum or mean" — matching "masked-mean" on the next line. "meant" would break the sentence. Left as-is.

    URLs — one real, three not

    Real: Qwen/Qwen3.5-35B-A3B-Instruct → 401. I confirmed it's gated rather than missing: the HF API returns 401 for it where a public model returns 200. docs/models/intern-s2-preview.md now documents that access must be granted on Hugging Face and authenticated locally (huggingface-cli login / HF_TOKEN), and that PRISM doesn't redistribute the weights. The note is in that doc rather than the citing file because src/encoders/intern_s2_preview/ is vendored upstream code CONTRIBUTING.md requires stay byte-identical.

    Not broken:

    • rest.kegg.jp/list/organism → 400 is already documented at kegg_curation_implementation_status.md:101, with root cause: KEGG deprecated the organism database name in favour of genome, and kegg_pull hasn't been updated. No newer release exists.
    • eutils.ncbi.nlm.nih.gov/entrez/eutils is a base API endpoint — 404s on a bare GET by design.
    • proxy.alcf.anl.gov:3128 is an HTTP_PROXY value, only resolvable inside the ALCF network.

    Left deliberately

    SECURITY.md's TODO says to confirm the supported-versions table at the v0.1.0 tag. That hasn't happened, so removing it would assert something untrue.

    Branch protection — and why a PR can't close this issue

    You noted protection isn't verifiable from a checkout. Correct. For the record it is applied here, verified by diffing both repos' protection payloads field by field: 9 required contexts, strict, enforce_admins: true, dismiss_stale_reviews, required_conversation_resolution, force-pushes and deletions blocked — identical to BaseMM_PRISM.

    Your suggestion to let a PR exercise that gate is a good instinct, but it can't work in this repo, and the reason is worth recording:

    PRISM's main is a root commit with zero parents, replaced wholesale by force-push. Each snapshot is a new root sharing no ancestry with the last. A PR branch here would be based on a commit the next snapshot discards — which is exactly what happened to Dependabot's #1, auto-closed when its base vanished. No PR has ever merged in this repo, and none usefully can.

    So branch protection here gates force-pushes, not PRs. The required contexts are real — CI runs on every snapshot push and has passed on all of them — but nothing will ever satisfy them en route to a merge. #248 exercised the gate in the repo where PRs belong.

    Keeping this issue open

    It's at 20 done / 11 open. The remaining work is Gate 1 legal (7 items, institutional), the pre-flip secret scan, site-path cleanup, the PyPI decision, a maintainer rota, the visibility flip and the v0.1.0 tag. The compliance review is satisfied; the repo isn't release-ready yet. A new Compliance review (2026-10-09) section in the issue body records what this closed.

    Two things that need a human, not me: the award numbers above, and the final copyright holder — ModCon is a placeholder, and the real answer is the same tech-transfer question BaseMM_PRISM#185 Gate 1 has tracked throughout.

  4. wildsm commented on Oct 11, 2026

    @wildsm
    Member

    Thanks for explaining about PRs to a different repo. But this begs the questions about whether you intend to maintain two repos indefinitely and whether the CONTRIBUTING in this repo is accurate (i.e., are you ignoring contributions here?).

    For the remaining uncheck items below:

    • Check the spelling
    • Carefully review links and that these are intentional errors
    • Have a human confirm branch protection for main in both repos (can also send screenshot via slack)

    Things to consider carefully

    • pyproject.toml license metadata: license = { text = "Apache-2.0" } has been updated to license = "Apache-2.0" plus explicit license-file metadata, which is a cleaner packaging signal. Evidence: pyproject.toml.
    • SECURITY.md: still has a TODO noting the supported-versions table should be confirmed at the v0.1.0 tag. That reads as release-readiness work, not a blocker. Evidence: SECURITY.md.
    • CONTRIBUTING.md: notes that some pre-existing absolute paths in generated docs/job scripts are still being cleaned up. That is a compliance hygiene item to finish, not a license issue. Evidence: CONTRIBUTING.md.
    • The build emitted setuptools deprecation warnings about [project].license being a TOML table and the Apache classifier in the previous review; those concerns are now addressed in the current tree. Evidence: pyproject.toml.

    Minor typos:

    In a number of places, you say that Aurora is the primary/canonical platform, but this will soon be outdated. What about cleaning up the language in each of the following places (if nothing else: could specify that this is the initially supported system, try to make more consistent with the other target language, add issues associated with todos/testing/deployments elsewhere, ...):

    • README.md: “Aurora (Intel Max Series GPUs, primary)” has been softened to “most exercised system.”
    • README.md: “Aurora (canonical)” in the installation table has been replaced with “Aurora (most exercised).”
    • CITATION.cff: “It targets DOE leadership-class systems, with Intel Max Series GPUs on Aurora as the primary platform.” has been updated to “most exercised system to date.”
    • docs/models/prism.md: “Primary platform | Intel Max Series GPUs on Aurora” has been updated to “Most exercised platform.”
    • docs/skills/prism-platforms/SKILL.md: “PRISM’s primary target is Aurora (Intel XPU)” has been softened to “most exercised on Aurora.”

    These urls did not work:

    Given how many labs contributed, there are a number of places with Argonne specific language that seems out of place. Other packages are using ModCon as temporary copyright or spelling out contributing initial institutions.

    • NOTICE
      • Copyright (c) 2026, ModCon. All Rights Reserved.
      • Followed by the U.S. Government contract / Argonne National Laboratory ownership statement.
    • README.md
      • Copyright (c) 2026, ModCon as the temporary holder.
      • Followed by the DOE Genesis Mission acknowledgment.
    • docs/models/prism.md
      • Copyright | ModCon, 2026 — temporary
      • Followed by the Argonne contract provenance statement.

    The funding acknowledgment in README is currently:

    This material is based upon work supported by the U.S. Department of Energy (DOE), Office of Science, Office of Advanced Scientific Computing Research in alignment with DOE's Genesis Mission.
    

    Please use what others have done as placeholders:

    This material is based upon work supported by the U.S. Department of Energy (DOE), Office of Science, Office of Advanced Scientific Computing Research in alignment with DOE's Genesis Mission.
    

    or if the contract numbers are vital, use

    This material is based upon work supported by the U.S. Department of Energy, Office of Science, Office of Advanced Scientific Computing Research, as part of the Genesis Mission Platform under Award Number(s) XXX, YYY, ZZZ.
    

    where all associated contract numbers are included

    Draft compliance review following the elements of https://github.com/AI-ModCon/BaseTemplate#required-elements-for-modcon-base-public-repositories :

    This issue and review were assisted by Codex and Co-pilot, I stand by it.

  5. vxnkjyffmq-code commented on Oct 15, 2026

    @vxnkjyffmq-code

    Thanks — this was a genuinely useful review. Everything actionable is merged as AI-ModCon/BaseMM_PRISM#248 (ecec35f).

    Fixes landed in BaseMM_PRISM, not here. PRISM is a snapshot of that tree, so a change applied only to this repo is discarded by the next re-snapshot. Upstream is the only place a fix survives.

    Acted on

    Item What changed
    Argonne-specific copyright Now ModCon, explicitly marked temporary, in NOTICE, README.md and docs/models/prism.md. The DOE contract paragraph is kept but rescoped to "portions of this software", since it doesn't describe every contribution.
    Funding acknowledgment Your first placeholder, verbatim. The award-numbers variant was not used — those numbers aren't known to me, and inventing them in an acknowledgment would be worse than the generic form. Happy to add them if you have the list.
    license = { text = ... } Now PEP 639: license = "Apache-2.0" plus license-files = ["LICENSE", "NOTICE"], and the redundant Apache classifier dropped. This clears both deprecation warnings you saw — rebuilt the wheel to confirm, and LICENSE and NOTICE land in dist-info/licenses/.
    Aurora "primary"/"canonical" → "most exercised" in all five places you listed. It's what the evidence supports and won't date as other systems come online.
    Typos explictly and Existance fixed.

    One typo declined, with reasoning

    meaned is correct. trainer_grpo.py:532 reads:

    "Left unreduced (not summed/meaned) so GRPOSimpleLoss.forward can apply its own masked-mean over the completion dimension…"

    It's the reduction verb — "not reduced by sum or mean" — matching "masked-mean" on the next line. "meant" would break the sentence. Left as-is.

    URLs — one real, three not

    Real: Qwen/Qwen3.5-35B-A3B-Instruct → 401. I confirmed it's gated rather than missing: the HF API returns 401 for it where a public model returns 200. docs/models/intern-s2-preview.md now documents that access must be granted on Hugging Face and authenticated locally (huggingface-cli login / HF_TOKEN), and that PRISM doesn't redistribute the weights. The note is in that doc rather than the citing file because src/encoders/intern_s2_preview/ is vendored upstream code CONTRIBUTING.md requires stay byte-identical.

    Not broken:

    • rest.kegg.jp/list/organism → 400 is already documented at kegg_curation_implementation_status.md:101, with root cause: KEGG deprecated the organism database name in favour of genome, and kegg_pull hasn't been updated. No newer release exists.
    • eutils.ncbi.nlm.nih.gov/entrez/eutils is a base API endpoint — 404s on a bare GET by design.
    • proxy.alcf.anl.gov:3128 is an HTTP_PROXY value, only resolvable inside the ALCF network.

    Left deliberately

    SECURITY.md's TODO says to confirm the supported-versions table at the v0.1.0 tag. That hasn't happened, so removing it would assert something untrue.

    Branch protection — and why a PR can't close this issue

    You noted protection isn't verifiable from a checkout. Correct. For the record it is applied here, verified by diffing both repos' protection payloads field by field: 9 required contexts, strict, enforce_admins: true, dismiss_stale_reviews, required_conversation_resolution, force-pushes and deletions blocked — identical to BaseMM_PRISM.

    Your suggestion to let a PR exercise that gate is a good instinct, but it can't work in this repo, and the reason is worth recording:

    PRISM's main is a root commit with zero parents, replaced wholesale by force-push. Each snapshot is a new root sharing no ancestry with the last. A PR branch here would be based on a commit the next snapshot discards — which is exactly what happened to Dependabot's #1, auto-closed when its base vanished. No PR has ever merged in this repo, and none usefully can.

    So branch protection here gates force-pushes, not PRs. The required contexts are real — CI runs on every snapshot push and has passed on all of them — but nothing will ever satisfy them en route to a merge. #248 exercised the gate in the repo where PRs belong.

    Keeping this issue open

    It's at 20 done / 11 open. The remaining work is Gate 1 legal (7 items, institutional), the pre-flip secret scan, site-path cleanup, the PyPI decision, a maintainer rota, the visibility flip and the v0.1.0 tag. The compliance review is satisfied; the repo isn't release-ready yet. A new Compliance review (2026-10-09) section in the issue body records what this closed.

    Two things that need a human, not me: the award numbers above, and the final copyright holder — ModCon is a placeholder, and the real answer is the same tech-transfer question BaseMM_PRISM#185 Gate 1 has tracked throughout.

    Would you like to see the rest of it being built I guess I could post it. I terraform the rest of it and locked it up.

  6. Sande33p commented on Oct 20, 2026

    @Sande33p
    CollaboratorAuthor

    Thanks — and you were right to push on the two-repo question. The answer has changed since I wrote it. PRISM is no longer a snapshot: tools/make_release_snapshot.sh is deleted (9b92e7d), PRs #4–#7 merged here directly, and BaseMM_PRISM has not moved since ecec35f on Oct 9. Development happens here now, so CONTRIBUTING is accurate and contributions to this repo are not ignored.

    Branch protection — now checkable rather than asserted

    You were right that test_branch_protection_contract.py reads source files, so it shows intent, not the live setting. #13 adds --verify, which reads the live protection from the API and diffs it against the policy the script applies:

    export GITHUB_TOKEN=$(gh auth token)
    
    python tools/ci/configure_branch_protection.py \
        --repo AI-ModCon/PRISM --branch main --verify --review-count 1
    Live branch protection for AI-ModCon/PRISM@main:
      [ok  ] required checks: live=['coverage_gate', 'doc_links', 'launcher_contract', 'lint', 'multimodal_contract', 'types (3.10)', 'types (3.12)', 'unit (3.10)', 'unit (3.12)']
      [ok  ] strict (branch up to date): live=True
      [ok  ] enforce_admins: live=True
      [ok  ] required approving reviews: live=1
      [ok  ] conversation resolution: live=True
      [ok  ] force pushes: live=False
      [ok  ] deletions: live=False
    
    Live protection matches the policy.
    

    Swap --repo AI-ModCon/BaseMM_PRISM for the other one. Exit code is 0 on match, 1 on mismatch, so it can run in CI — which a screenshot cannot — and anyone with read access can reproduce it.

    Two caveats, since you caught an overclaim last time:

    • It reads the setting; it does not test enforcement. We have that separately, by accident: I tried to push these fixes straight to main today and GitHub refused.
    • The verdict depends on the flags. --review-count is the expectation you assert, not something read from the server, so quote the command with the output.

    Required approving reviews is now 1, raised after #13 merged (3249ed4d). Any approver counts: applying the policy briefly turned on require_code_owner_reviews (the script's default), which would have restricted approvals to @AI-ModCon/base-multimodal; that has been turned back off, so the live setting is one approving review from anyone with access.

    Spelling

    meaned → averaged in #13. I also swept every tracked .md and .py for ~25 common misspellings (explictly, existance, seperate, recieve, thier, paramter, …) — no remaining hits.

    Links

    • NCBI — your suggestion was right; trimmed to https://eutils.ncbi.nlm.nih.gov, which resolves.
    • Qwen/Qwen3.5-35B-A3B-Instruct — our own docs/models/intern-s2-preview.md said the 401 meant the model is gated. That was wrong: a gated repository serves its card with 200 and gates only downloads, so 401 means it does not resolve. The rest of the family does (Qwen3.5-9B, -4B, -35B-A3B), so -Instruct looks like the error and Qwen/Qwen3.5-35B-A3B is the nearest real checkpoint. Doc corrected; the files citing it are vendored upstream code kept byte-identical, so they are deliberately untouched.
    • proxy.alcf.anl.gov:3128 and rest.kegg.jp/list/organism — I would leave these. Both are already in backticks: an HTTP proxy address and a REST endpoint. Both should fail a browser GET, and check_doc_links.py skips absolute URLs for that reason. Happy to reword if your scanner still flags them.

    Still open

    SECURITY.md's supported-versions table and the two CHANGELOG promotions are gated on the v0.1.0 tag, which NOTICE blocks until the copyright holder is settled with Argonne tech transfer and the other contributing institutions. One commit once that is answered — the most useful thing anyone could unblock here.

    Funding acknowledgment

    Your two placeholder blocks are byte-identical, so I think the first paste did not take. Which did you intend? If it is the award-number form I will need the contract numbers for all contributing institutions.


    On disclosure: noted that this review was Codex- and Copilot-assisted and that you stand by it. Same here — #12 and #13 both carry an unticked AI-assistance box pending a human line-by-line read. That matters most for #12, which recovers ~16k lines written in an uncommitted worktree that nobody has yet read for correctness.

  7. Sande33p commented on Oct 20, 2026

    @Sande33p
    CollaboratorAuthor

    Tracking table for the open items, so they are in one place. Your review above is untouched — these are my assessments to tick or push back on. Line references are against main at 3249ed4d.

    # Item Status Where
    1 SECURITY.md supported-versions TODO ⏸ Blocked Gated on the v0.1.0 tag
    2 trainer_grpo.py says meaned ✅ Fixed #13 (merged) — now averaged
    3 proxy.alcf.anl.gov:3128 ✅ Fixed #14 — now cites the ALCF docs page
    4 eutils.ncbi.nlm.nih.gov/entrez/eutils ✅ Fixed #13 (merged) — trimmed to the root, as you suggested
    5 Qwen/Qwen3.5-35B-A3B-Instruct ✅ Fixed #13 (merged) — doc corrected
    6 rest.kegg.jp/list/organism ✅ Fixed #14 — now cites the KEGG REST API reference
    7 Branch protection on main ✅ Verifiable #13 (merged) — --verify; reviews now 1

    To check item 7 yourself, from a PRISM checkout:

    export GITHUB_TOKEN=$(gh auth token)
    python tools/ci/configure_branch_protection.py --repo AI-ModCon/PRISM --branch main --verify --review-count 1

    Prints each field with live=, exits 0 on match and 1 on mismatch. Swap --repo AI-ModCon/BaseMM_PRISM for the other one. It reads the setting rather than testing enforcement — for that, note that GitHub refused my attempt to push these fixes straight to main today.

    On 3 and 6 — these were not link rot: both were already backticked code, an HTTP proxy endpoint and a REST endpoint, and both correctly fail a browser GET. But neither gave a reader anywhere to go, so each now cites a page that resolves beside the literal value. The values stay, since they are configuration a reader needs.

    #14 is open and needs an approval, along with #3, #9, #10, #11 and #12 — required reviews is now 1 and enforce_admins is on, so I cannot self-approve. #12 is the one that most needs a careful read: it recovers ~16k lines that were written in an uncommitted worktree.

    On 1 — SECURITY.md, the two CHANGELOG promotions and the tag itself all wait on NOTICE's open question: who the copyright holder is, pending Argonne tech transfer and the other contributing institutions. One commit once that is settled, and the last thing between the repo and v0.1.0.

    Still outstanding from my previous comment: which of your two funding-text blocks you meant — they came through byte-identical.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions