Ollama Full-Pass Analysis — Status & Methodology Quran Ollama Full-Pass — Status Report Generated: 2026-03-05 MC Task: #1949 (previous failed), this run: test pass Status: TEST CHUNKS COMPLETE — 3/35 chunks verified, production run ready Model Used qwen2.5-coder:32b (19GB, Ollama local, Mac Studio M3 Ultra 96GB RAM) Rationale: Largest available reasoning model in the Ollama lineup on this machine 32B parameters gives substantially better analytical depth than llama3.1:8b M3 Ultra's 96GB unified memory easily accommodates 19GB model + up to 32K context qwen2.5-coder is an instruction-following model with strong analytical capability despite the "coder" label — verified via test chunks Other models available (not used): llama3.1:8b — fallback, 4.9GB, faster but lower quality reasoning alaiml-task-v1 , alaiml-email-v1 , alaiml-tender-v1 — custom fine-tunes, not suitable for Quran analysis llama-guard3:8b — safety classification model, not suitable bge-m3:latest — embedding model only nomic-embed-text:latest — embedding model only Chunking Strategy Algorithm: Ayah-budget-aware greedy grouping with special handling for very large surahs. Target: ~180 ayahs per chunk Total chunks: 35 (covering all 114 surahs, 6,236 ayahs) Rules: Surahs with ≥180 ayahs get their own dedicated chunk (prevents context overflow from a single massive surah) Remaining surahs are greedily grouped: add next surah if total stays ≤180 ayahs AND group already has ≥2 surahs This creates semantically coherent groupings that stay within Ollama's processing ability Why this beats the previous approach (MC Task #1949): Previous attempt used the Claude agent runner which hit max turns — each surah was one API call to a Claude agent session, causing turn exhaustion at ~50+ surahs New approach: standalone Node.js script calls Ollama directly via HTTP — no turn limit, no session state, pure function calls Resume capability via file existence check — if chunk file exists, skip. Can be interrupted and restarted at any point Chunk plan (all 35): Chunk Ayahs Surahs 01 7 1: Al-Faatiha 02 286 2: Al-Baqara 03 200 3: Aal-i-Imraan 04 296 4: An-Nisaa, 5: Al-Maaida 05 165 6: Al-An'aam 06 206 7: Al-A'raaf 07 204 8: Al-Anfaal, 9: At-Tawba 08 232 10: Yunus, 11: Hud 09 154 12: Yusuf, 13: Ar-Ra'd 10 151 14: Ibrahim, 15: Al-Hijr 11 239 16: An-Nahl, 17: Al-Israa 12 208 18: Al-Kahf, 19: Maryam 13 247 20: Taa-Haa, 21: Al-Anbiyaa 14 196 22: Al-Hajj, 23: Al-Muminoon 15 141 24: An-Noor, 25: Al-Furqaan 16 227 26: Ash-Shu'araa 17 181 27: An-Naml, 28: Al-Qasas 18 163 29: Al-Ankaboot, 30: Ar-Room, 31: Luqman 19 157 32: As-Sajda, 33: Al-Ahzaab, 34: Saba 20 128 35: Faatir, 36: Yaseen 21 182 37: As-Saaffaat 22 163 38: Saad, 39: Az-Zumar 23 139 40: Ghafir, 41: Fussilat 24 142 42: Ash-Shura, 43: Az-Zukhruf 25 169 44: Ad-Dukhaan, 45: Al-Jaathiya, 46: Al-Ahqaf, 47: Muhammad 26 152 48: Al-Fath, 49: Al-Hujuraat, 50: Qaaf, 51: Adh-Dhaariyat 27 166 52: At-Tur, 53: An-Najm, 54: Al-Qamar 28 174 55: Ar-Rahmaan, 56: Al-Waaqia 29 166 57-66 (10 short Medinan surahs) 30 178 67: Al-Mulk, 68: Al-Qalam, 69: Al-Haaqqa, 70: Al-Ma'aarij 31 172 71: Nooh, 72: Al-Jinn, 73: Al-Muzzammil, 74: Al-Muddaththir, 75: Al-Qiyaama 32 167 76: Al-Insaan, 77: Al-Mursalaat, 78: An-Naba, 79: An-Naazi'aat 33 173 80-85 (Abasa through Al-Burooj) 34 175 86-95 (At-Taariq through At-Tin) 35 130 96-114 (Al-Alaq through An-Naas) Extraction Targets Per Chunk Each chunk extracts 6 structured sections: Theological themes and relationships — 3-7 major themes, with verse citations [surah:ayah] and cross-surah connections Linguistic patterns — repetition (verbatim counts), parallelism, chiasm/ring structures, refrains, oath structures Numerical observations — verse counts, 19-divisibility checks, surah+verse sums, notable word frequency counts Cross-references and intertextuality — verse echoes, shared prophet narratives, bookend relationships Distinctive vocabulary and phrases — 5-10 unique terms, hapax legomena candidates, technical theological terms Chunk summary — 3-5 sentence spiritual arc of the chunk Test Chunk Results Chunk 1 — Al-Faatiha (7 ayahs) Time: 180.7s total (151.1s generation) Output: 1,398 tokens, 5,484 chars Speed: 9.3 tok/s Quality: Excellent. Correctly identified chiasm A-B-C structure, parallelism in "Thee alone we worship / Thee alone we ask", themes of tawhid, divine attributes, worship, guidance. Cited verse numbers correctly. Prompt tokens: 865 Chunk 2 — Al-Baqara (286 ayahs) Time: 222.0s total (167.0s generation) Output: 1,441 tokens, 5,340 chars Speed: 8.6 tok/s Quality: Good. Identified monotheism, divine justice, faith+actions, divine guidance, eschatology. Detected refrain "O our Sustainer!" and parallelism in 2:277. Issue noted: Prompt was ~20K tokens but num_ctx was 8192 → model saw only the last portion of Al-Baqara. Fixed in script update (dynamic num_ctx up to 32768). Prompt tokens: 8,192 (was capped at context limit — now fixed) Chunk 3 — Aal-i-Imraan (200 ayahs) Time: 191.5s total (136.6s generation) Output: 1,284 tokens, 4,915 chars Speed: 9.4 tok/s Quality: Good. Identified 5 themes (monotheism, prophethood, accountability, patience, hypocrisy), refrain "And God is aware of all that you do" at [3:154] and [3:160], cross-reference to Al-Baqara 2:208 and An-Nisa 4:173. Prompt tokens: 8,192 (same issue — fixed for future runs) Fix Applied After Test: Dynamic Context Window Problem: num_ctx: 8192 was hardcoded. Large surahs (Al-Baqara = ~20K prompt tokens) had their text truncated. Fix in ollama-chunk-runner.js : const promptTokenEst = Math.ceil(prompt.length / 3.5); const outputBudget = 4096; const numCtx = Math.min(32768, Math.max(8192, promptTokenEst + outputBudget + 512)); This dynamically sizes the context window to fit the full prompt + output budget, capped at 32768 (qwen2.5-coder:32b max). The M3 Ultra has sufficient RAM for 32K context on a 19GB model. Implication: Large chunks (Al-Baqara, An-Nisaa+Al-Maaida, etc.) should now receive their full text. Chunks 2-4 should be re-run after clearing the existing output files if full-text analysis is required. Time Estimates Based on 3 test runs with qwen2.5-coder:32b: Metric Value Chunk 1 (7 ayahs) 181s Chunk 2 (286 ayahs) 222s Chunk 3 (200 ayahs) 192s Average per chunk ~198s (~3.3 min) 35 chunks × 198s ~115 minutes (~1.9 hours) Revised estimate with dynamic context fix: Very large chunks (>200 ayahs) will take longer due to increased context loading Estimated 240-300s for the largest chunks (02, 04, 06, 07, 08, etc.) Conservative full-pass estimate: 2.5 - 3 hours To run the full pass (resumes from chunk 4 onward, chunks 1-3 already done): bash ~/system/context/quran/ollama-full-pass.sh 4 35 To run from the beginning (chunks 2+3 will be skipped due to resume logic): bash ~/system/context/quran/ollama-full-pass.sh To re-run chunks 2-3 with the context fix (delete existing files first): rm ~/system/context/quran/ollama-analysis/chunk-02.md rm ~/system/context/quran/ollama-analysis/chunk-03.md bash ~/system/context/quran/ollama-full-pass.sh 2 3 Files Created File Purpose ~/system/context/quran/ollama-full-pass.sh Main orchestrator shell script ~/system/context/quran/ollama-chunk-runner.js Node.js Ollama caller + output formatter ~/system/context/quran/ollama-analysis/chunk-01.md Al-Faatiha analysis ~/system/context/quran/ollama-analysis/chunk-02.md Al-Baqara analysis (partial — context limit) ~/system/context/quran/ollama-analysis/chunk-03.md Aal-i-Imraan analysis (partial — context limit) ~/system/context/quran/ollama-analysis/manifest.json Machine-readable progress tracker ~/system/context/quran/ollama-analysis/run.log Run log for resume diagnostics Issues Encountered Issue 1: Context window truncation on large surahs (FIXED) Problem: num_ctx: 8192 caused Al-Baqara's 20K-token prompt to be truncated to last ~8K tokens only. Model analyzed tail end of the surah rather than full text. Fix: Dynamic num_ctx calculation in ollama-chunk-runner.js — scales up to 32768. Recommendation: Re-run chunks 2 and 3 for full-text analysis. Issue 2: Model hallucinated "286 divisible by 19" (minor) Problem: In chunk 2 analysis, model stated "The number of verses (286) is divisible by 19, a significant number in Quranic research." — 286 / 19 = 15.05, not divisible. Diagnosis: Model pattern-matched "286 and 19" association without checking arithmetic. Classic hallucination pattern. Mitigation: The prompt explicitly says to "flag any 19-related patterns" — but does not ask the model to verify arithmetic. A post-processing verification step could check all divisibility claims. Recommendation: Add a numerical fact-check pass as a separate script that verifies divisibility claims. Issue 3: Chunk 1 is too small (7 ayahs) Observation: Al-Faatiha (7 ayahs) produced good analysis but is a single very short surah. The 181s processing time is dominated by model loading (~30s) + context construction, not actual content. No fix needed — Al-Faatiha is always analyzed alone due to its unique status as the opening prayer. Quality Assessment Section Chunk 1 Chunk 2 Chunk 3 Theological themes Excellent Good Good Linguistic patterns Good Good Good Numerical observations Adequate Poor (hallucination) Adequate Cross-references Good Adequate Good Distinctive vocab Good Adequate Adequate Chunk summary Excellent Good Good Overall A B- B+ The quality degrades slightly for large surahs due to context truncation. After the fix, chunks 2+ should reach A/B+ quality consistently. Next Steps Re-run chunks 2-3 after deleting existing files (context fix) Run full pass chunks 4-35: bash ~/system/context/quran/ollama-full-pass.sh 4 35 After completion: write synthesis script that aggregates cross-chunk patterns Optional: second pass with llama3.1:8b for comparison on selected chunks Index all 35 chunk outputs in BookStack under Knowledge Base → Quran Research