Skip to content

fix(ci): init every vendored submodule in the release Docker builds - #5596

Merged
M3gA-Mind merged 1 commit into
tinyhumansai:mainfrom
M3gA-Mind:fix/5594-release-submodule-list
Aug 19, 2026
Merged

fix(ci): init every vendored submodule in the release Docker builds#5596
M3gA-Mind merged 1 commit into
tinyhumansai:mainfrom
M3gA-Mind:fix/5594-release-submodule-list

Conversation

@M3gA-Mind

@M3gA-Mind M3gA-Mind commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • The release Docker jobs initialised submodules from a hand-maintained 8-entry list while .gitmodules declares 10, so vendor/tinyhosts and vendor/tinywallet were never checked out and cargo could not resolve two path dependencies.
  • Production releases have been blocked since 2026-08-07; staging carries a byte-identical list and is broken the same way. Both are fixed here.
  • The enumeration is removed, not corrected: nothing remains that it could legitimately exclude, so a subset is always a bug.
  • ⚠️ Release-blocking — this needs to reach release. It targets main per the fleet default; a maintainer will need to promote or cherry-pick it, since release is where the blocked pipeline actually runs.

Problem

The Dockerfile does COPY vendor/ vendor/, so an uninitialised submodule arrives in the image as an empty directory. Cargo then fails on the missing manifest before compiling anything:

error: failed to get `tinyhosts` as a dependency of package `openhuman v0.63.12 (/build)`
Caused by: failed to read `/build/vendor/tinyhosts/Cargo.toml`
Caused by: No such file or directory (os error 2)

optional = true does not exempt these: cargo reads every path dependency's manifest to build the lockfile whether or not the feature is enabled. The failing build proves it — tinyhosts is declared optional = true and still broke resolution.

Fixing only tinyhosts would not have worked. Cargo stops at the first unresolvable dependency, and tinywallet (Cargo.toml:524) sits behind tinyhosts (:493). Both were missing; both are added.

Solution

I removed the list rather than adding two names to it, and the deciding evidence is that nothing is left for it to exclude:

  1. The stated rationale is gone. The comment justified the subset as skipping "the large tauri-cef fork the core image doesn't need". tauri-cef stopped being a submodule in 1843706c3 refactor(tauri): replace CEF runtime with upstream Wry. It is not in .gitmodules today, so a recursive init cannot pull it — the ~28 remaining tauri-cef references in the tree are docs, scripts and TS, plus exactly one Cargo.toml line that is a comment, not a dependency.
  2. All ten declared submodules are required. Every entry in .gitmodules is a path dependency of the root crate. The only other vendor/ path dep, motosan-ai-oauth, is a committed directory rather than a submodule (git ls-files lists its sources), so it is unaffected either way. A correct list is therefore always all ten — the enumeration had no legitimate degrees of freedom left, only the ability to be wrong.
  3. Nothing heavy gets dragged in. The two missing crates are 508K and 836K, and their only nested submodule is tinybus, which the old list already named.
  4. It had already drifted three times, each surfacing at release time rather than in PR CI — tinymemory (fixed in 54f8710f), then tinywallet and tinyhosts together (this issue). Correcting it a third time would schedule a fourth.

This also makes the proposed "add a CI guard that asserts the list matches Cargo.toml" follow-up unnecessary for this class: there is no list left to drift.

Both files get the identical change, so staging and production cannot diverge again.

Verification — the pipeline is the only real test

Stated plainly: a .github/workflows change cannot be proven locally. It only executes on a workflow_dispatch of the release pipelines, which I am not authorised to run, and this repo's rule is to verify Rust through CI rather than building locally.

What I could check, I did:

  • Both files parse as YAML, and the changed step resolves to exactly git submodule update --init --recursive in the build-docker job of each (11 jobs parsed in production, 5 in staging).
  • .gitmodules declares 10 paths; the old list named 8; the two missing names are exactly vendor/tinyhosts and vendor/tinywallet.
  • git submodule update --init vendor/tinyhosts vendor/tinywallet succeeds and both contain a Cargo.toml — so the checkout the workflow will now perform does produce the manifests cargo was looking for.
  • tauri-cef absent from .gitmodules, and the commit that removed it identified.

The honest confirmation is the next Release Staging dispatch reaching the Docker build step. Nothing in this PR is exercised by PR CI, so a green run here is not evidence the fix works.

Submission Checklist

  • N/A: this is a .github/workflows change with no application code; there is no unit-testable surface, and the only execution path is a release dispatch. — Tests added or updated (happy path + at least one failure / edge case)
  • N/A: no changed lines are Rust or TS, so diff-cover has nothing to measure on this diff. — Diff coverage ≥ 80%
  • N/A: behaviour-only CI change; no feature rows added, removed or renamed. — Coverage matrix updated
  • N/A: no feature IDs are touched by a workflow submodule-init change. — All affected feature IDs listed under ## Related
  • No new external network dependencies introduced — the two submodules are already declared in .gitmodules and already fetched by every other job that uses submodules: recursive; this adds no new remote.
  • N/A: no release-cut surface changes — the smoke checklist covers what a release produces, and this changes only how the builder checks out its sources. (It does unblock the release from running at all.) — Manual smoke checklist updated
  • Linked issue closed via Closes #NNN in the ## Related section

Impact

Platform: Linux/Docker (openhuman-core image) on the production and staging release pipelines. No runtime, application or user-visible change — nothing ships differently, the builder simply checks out the sources it already required.

Performance: two additional submodules and their nested tinybus (already fetched). 508K + 836K, negligible against the image build.

Security / compatibility / migration: none. No new remotes, no dependency version changes, no lockfile change.

Risk if wrong: contained to the release pipeline, which is already failing — this cannot regress a passing state.

Related


AI Authored PR Metadata (required for Codex/Linear PRs)

Linear Issue

Commit & Branch

  • Branch: fix/5594-release-submodule-list
  • Commit SHA: fe5bcb224

Validation Run

  • N/A: no files under app/ are touched. — pnpm --filter openhuman-app format:check
  • N/A: no TypeScript is touched; the diff is two workflow YAML files. — pnpm typecheck
  • N/A: there is no test that exercises a workflow file. Focused checks run instead: both YAMLs parse and the changed step resolves to the intended command in each build-docker job. — Focused tests
  • N/A: no Rust changed. Building openhuman locally is also disallowed in this repo; Rust is verified through CI. — Rust fmt/check (if changed)
  • N/A: no Tauri/src-tauri files changed. — Tauri fmt/check (if changed)

Validation Blocked

  • command: the release pipelines (Release Staging / Release Production, workflow_dispatch)
  • error: not run — dispatching a release is a maintainer action, and PR CI does not execute these workflows
  • impact: the fix is unverified end-to-end until a release dispatch reaches the Docker build step. The failure mode if it is still wrong is identical and immediate (cargo cannot read a vendor/*/Cargo.toml), so it fails loudly rather than shipping a bad image.

Behavior Changes

  • Intended behavior change: the release Docker jobs initialise every declared submodule instead of eight named ones.
  • User-visible effect: none directly. Indirectly, production and staging releases can build again.

Parity Contract

  • Legacy behavior preserved: yes for the eight previously-named submodules — they are still initialised recursively, by the same command in the same step. The change is purely additive in effect (8 → 10).
  • Guard/fallback/dispatch parity checks: production and staging receive byte-identical edits, which is what stops the two pipelines drifting apart again — they were byte-identical before and are byte-identical after.

Duplicate / Superseded PR Handling

Summary by CodeRabbit

  • Bug Fixes
    • Improved production and staging release builds by ensuring all required Rust components are initialized automatically.
    • Removed outdated exclusions that could cause release builds to fail when new components were added.

The Docker job named eight submodule paths by hand while `.gitmodules`
declares ten, so `vendor/tinyhosts` and `vendor/tinywallet` were never checked
out. The Dockerfile COPYs `vendor/`, so both arrived in the image as empty
directories and cargo failed on the missing manifest before compiling
anything. Production releases have been blocked since 2026-08-07 and staging
carries a byte-identical list.

Fixing the two names would have restored the build and left the defect. The
list's stated purpose was to skip "the large tauri-cef fork the core image
doesn't need", and that fork stopped being a submodule in `1843706c3
refactor(tauri): replace CEF runtime with upstream Wry`. Nothing remains for
an enumeration to exclude: all ten entries are `path` dependencies of the root
crate, and cargo reads every one of their manifests during resolution whether
or not the feature is enabled — which is why an `optional = true` crate broke
the build. A subset is therefore always wrong.

It had already gone stale three times, each surfacing at release time rather
than in PR CI. So the enumeration is removed rather than corrected again.

Nothing heavy is pulled in: the two missing crates are 508K and 836K, and
their only nested submodule is `tinybus`, which the old list already named.
@M3gA-Mind
M3gA-Mind requested a review from a team August 19, 2026 20:28
@M3gA-Mind

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

No new commits to review since the last review.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5aeca19d-38ab-48d4-9754-79dd65b9fd0d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 77dd5080-07d5-47aa-a164-00253f1066ae

📥 Commits

Reviewing files that changed from the base of the PR and between 51f32a2 and fe5bcb2.

📒 Files selected for processing (2)
  • .github/workflows/release-production.yml
  • .github/workflows/release-staging.yml

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

Both production and staging Docker release workflows now initialize all vendored Rust submodules recursively. The obsolete hard-coded path lists and tauri-cef exclusion rationale were removed.

Changes

Release submodule initialization

Layer / File(s) Summary
Use recursive submodule initialization
.github/workflows/release-production.yml, .github/workflows/release-staging.yml
Both workflows now initialize all submodules without explicit vendor paths. Comments document the removal of the stale enumeration.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: 🔵 Low · up to fe5bc

The workflows now initialize every declared vendored submodule, addressing the missing manifests without changing shipped application behavior. The PR is mergeable with explicit maintainer follow-up because it targets main while the blocked release jobs run from release and must be promoted or cherry-picked.

Possibly related PRs

Suggested labels: infra-ci-release

Suggested reviewers: senamakel

Poem

A rabbit checks each nested crate,
No vendor path is left to wait.
Tiny hosts and wallets hop in line,
Production and staging builds align.
The submodule list now grows just fine.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Both release workflows now initialize all submodules, including tinyhosts and tinywallet, which satisfies issue #5594.
Out of Scope Changes check ✅ Passed The changes are limited to the two release Docker workflows and directly address the linked issue.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: initializing every vendored submodule in the release Docker builds.

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.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tinysweeper found nothing blocking. Approving.

$0.0000 · 0 in / 0 out · 182 embedded · openrouter/openai/text-embedding-3-small

@tinysweeper tinysweeper Bot added the priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect. label Aug 19, 2026
@coderabbitai coderabbitai Bot added the infra-ci-release CI, release automation, packaging, build containers, and test harnesses. label Aug 19, 2026
@M3gA-Mind
M3gA-Mind merged commit ccf515d into tinyhumansai:main Aug 19, 2026
30 of 34 checks passed
M3gA-Mind added a commit that referenced this pull request Aug 20, 2026
A submodule pointer bump currently skips every openhuman Rust lane while the
aggregate gate still reports success. Reproduced on the tip of main:

  92bab8d "bump tinycortex" - the only change is the vendor/tinycortex pointer

  CI Lite run 32358998415:
    success   TinyCortex Memory Tests
    success   PR CI Gate
    skipped   Rust Quality (fmt, clippy)
    skipped   Rust Core Coverage (cargo-llvm-cov)
    skipped   Rust Feature-Gate Smoke (gates off)
    skipped   Rust Tauri Coverage (cargo-llvm-cov)

So the current tip of main has never been compiled by CI, and main is what
gets promoted to release.

Cause: the `rust-core` and `rust-core-full` filters enumerated exactly two
vendored paths - `vendor/motosan-ai-oauth/**` and `vendor/tinychannels` - out of
ten submodules, and `rust-tauri` named none at all. The `tinycortex` filter that
did match feeds only TinyCortex's own test lane, which is why that ran while
nothing compiled openhuman against the new pin.

Every vendored crate is force-resolved by path through `[patch.crates-io]`, in
BOTH cargo worlds, so any pointer bump changes what the core and the shell
compile against. This is the same defect the release Docker job had: a
hand-maintained submodule list that went stale three times before fe5bcb2
(#5596) replaced it with `--init --recursive`. Enumerating the ten paths here
would fail the same way on the eleventh, so this matches on `vendor/**` and
`.gitmodules` instead.

`rust-core-full` gets them too: a dependency-graph change invalidates per-module
test scoping exactly as a Cargo.lock change does, so a bump should run the full
suite rather than a scoped subset.

Cost: a vendored bump now runs the full Rust lanes rather than nothing. That is
the point - eight of the ten crates could previously move with zero verification.

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

Labels

infra-ci-release CI, release automation, packaging, build containers, and test harnesses. priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Release Docker build fails: hardcoded submodule init list omits vendor/tinyhosts and vendor/tinywallet

1 participant