Joshua overseer
db0835342f Bound ai_runs saves and redact every stored column
603db32a41 Assert the late-save row is ok to prove the post-save timeout path
7b81d48150 Fail a run whose ai_runs row is saved after the skill timeout
a6f750ea04 Report work that ends after the skill timeout as llm.ErrTimeout
d03068ace5 Add concurrency guards to harness.Run: single-flight, semaphore and timeouts
6a7c040657 Build the run's provider from the key it redacts; record render failures
8f5ab773fc Clear offline data on logout, test offline plan and recipe reads, drop Pillow
b0cf6fb951 Record every harness run in ai_runs with redaction and purge
7f8ae90978 Open saved pages offline, cache recipe reads, flag cache fallbacks
d2d5e9c742 Reduce letter folds to a fixed point in gen_folds.py
1fa295b131 Merge dev into Feature 06 branch before integration review
8adbd2d7c2 Merge pull request 'Feature 08: LLM provider layer' (#49) from feature/5dd6e253-cc9b-41f3-9091-bb834f7a373a-llm-provider-layer into dev
b347e1c911 Retry, backoff and default Generate timeout (#48)
e105cdb9c5 Add xAI Grok as a provider (#46)
9ace3aba9f Provider presets and factory (#44)
Compare 9 commits »
7729488cde Fold names by Unicode decomposition in Normalize
1e0b1fc75e Name normalization and dedupe
695003c5f7 Tighten iOS Safari detection and report install hint storage failures