Skip to content

[pull] main from off-grid-ai:main#39

Merged
pull[bot] merged 17 commits into
bhardwajRahul:mainfrom
off-grid-ai:main
Jul 24, 2026
Merged

[pull] main from off-grid-ai:main#39
pull[bot] merged 17 commits into
bhardwajRahul:mainfrom
off-grid-ai:main

Conversation

@pull

@pull pull Bot commented Jul 24, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

…HF vision repos

Hits real Hugging Face (no mocks) for every curated vision repo + popular families,
runs the real pair→rename→belongs pipeline, and asserts the projector belongs after
rename. Red today for the ggml-org `mmproj-<ModelName>-<quant>` shape (SmolVLM, Qwen2.5-VL,
pixtral, InternVL). Also locks the separate no-pairing bug set as a tracked ledger.
ggml-org names projectors `mmproj-<ModelName>-<quant>.gguf` (model name AFTER the mmproj
token). The old `/mmproj.*$/` kept that model name, doubling the on-disk identity stem, so
mmProjBelongsToModel refused it, linkOrphanMmProj cleared the link, and the model loaded
text-only → initMultimodal never ran → 'Multimodal support not enabled' on a vision send
(device 2026-07-23, iPhone 12, SmolVLM). Extract only the precision token so the on-disk
stem always matches the model. Verified against live HF: 8 rename-broken repos now pass,
the 6 already-working stay working.
…ne test

Replace the always-network tests (flaky, slow) with the capture-once/reuse pattern:
UPDATE_HF_FIXTURES=1 downloads the real HF listing + real GGUF header bytes for every vision
repo into a committed fixture; normal runs replay the real pair→rename→belongs pipeline over
that captured real data in ~0.5s, offline, deterministic. Reverting the fix flips the ggml-org
curated repos red. Tracks the separate no-pairing bug as a ledger.
…eam)

Fixes the second mmproj bug class found in the live-HF sweep, so ALL vision-projector
shapes pair + belong:
- `mmproj-model-<prec>` literal placeholder → treated as a generic repo-single-model
  projector (ggml-org gemma-3, openbmb MiniCPM).
- unsloth `UD-` dynamic-quant packaging stripped from the identity stem so a UD-quant
  model matches its non-UD projector (Mistral-Small-3.1).
- moondream `-text-model` weights marker normalized so the weights and `-mmproj` file
  share a stem.
Strict matching preserved — E2B still refuses an E4B projector (unit test). Verified over
live-HF fixture data: every curated + popular vision repo now pairs and its on-disk name belongs.
…oken)

Addresses SonarCloud (super-linear regex backtracking, download.ts:35) and CodeRabbit
(take the projector's OWN trailing precision, not the first precision-like token in the
name) in one change. Also: fixture refresh now throws on a HF 429/5xx instead of silently
persisting an empty fixture.
…Android fail was transient (load-timing watch-item, not a blocker)
… pointers

Consolidate all repo rules into one canonical rules.md so the standard is identical whatever
agent reads it (Claude/Codex/etc.). CLAUDE.md and AGENTS.md now just reference it (AGENTS.md was
also stale — claimed pre-commit gates + unit+integration tests, contradicting the pre-push gates
and lean one-integration-test doctrine). Adds an On-device testing & verification playbook that
codifies the WDA(iOS)/adb(Android) direct-drive flow, coordinate math, fix-onto-device build paths,
log-pull, the both-devices-before-merge gate, and the macOS/permission-dialog/flaky-gate gotchas.
…itialized

fix(A1): iOS vision 'Multimodal support not enabled' — keep only precision in mmproj on-disk name
…tead

The hosted android-build runner repeatedly hung for 3+ hours on the native C++ builds
(react-native-audio-api, op-sqlite) and burned hours per PR. Move it to a LOCAL pre-merge
gate: `cd android && ./gradlew assembleDebug assembleRelease` before merging any native/
Android/gradle/deps change (recorded in rules.md). JS-only / docs PRs don't need it.
docs: single tool-neutral rules.md; CLAUDE.md + AGENTS.md as thin pointers
Replaces the removed CI android-build with a LOCAL pre-push gate, and adds the iOS build too:
- Android: `assembleDebug assembleRelease` when .kt/.kts, android/, or package*.json change.
- iOS: simulator build (CODE_SIGNING_ALLOWED=NO) when .swift, ios/, or Podfile change.
JS-only / docs pushes skip both and stay fast.
chore: move Android+iOS native builds from CI to a local pre-push gate
Update the pre-push gate table: Android (assembleDebug assembleRelease) and iOS (simulator,
no-signing) builds now run locally on push, scoped to native/gradle/pods/deps changes. Note the
CI android-build was removed (hung 3+ hours). Verified: assembleRelease builds both APKs locally.
…ilds

docs(rules): native builds now run on pre-push, not CI
…(parity with Android)

A native dep bump affects both platforms; the iOS trigger was missing package*.json (Android had it).
Verified both hook build commands compile locally: Android assembleDebug+assembleRelease → both APKs;
iOS simulator build (CODE_SIGNING_ALLOWED=NO) → OffgridMobile.app.
fix(hooks): package.json changes also trigger the iOS pre-push build (parity)
@pull pull Bot locked and limited conversation to collaborators Jul 24, 2026
@pull pull Bot added the ⤵️ pull label Jul 24, 2026
@pull
pull Bot merged commit 3a277e1 into bhardwajRahul:main Jul 24, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant