• rockachopa released this 2026-10-15 12:19:46 +00:00 | 58 commits to main since this release

    Timmy the Talking Turd — daily review release daily-2026-10-15

    • Version: 2026-10-15-3b267c0fff31
    • Commit: 3b267c0fff31c36a5afdabd199ce2f7a7b1915aa (merge commit of PR #77, built from a clean checkout of main)
    • Built (UTC): 2026-10-15T12:12:25Z
    • Reviewed on: America/New_York 2026-10-15
    • Source archive SHA-256: 04c07fd4ba50df5d754b449e5474cf58e2a82faef181fd2095e0fbf9b7542dd4
    • Demo video SHA-256: 6c7762308fc18ee39520f7c351dd451c4ba94468978ebc0b9cbf8e216ca2f8b3
    • Model / profile: operator run — Hermes Agent cron (profile default, deepseek-flash). Product vision profiles — hosted VLM and self-hosted SmolVLM2 pinned bootstrap; the pinned model must be loaded, not merely reachable, before the app offers AI. No model weights ship in this release.

    Release delta — what visibly changed since daily-2026-10-14

    Red-flag escalation now fires for the wording people actually use — and a reported symptom can never be silently cleared.

    The deterministic red-flag detector (src/domain.js) matched a narrow set of literal phrases. Probing real clinical wording against the previous release showed 18 of 18 checked phrasings missed, so those turns reached the Hermes provider instead of Timmy's own fixed medical guidance:

    • There is blood when I wipe, bleeding from my back passage, blood mixed in my poo
    • I have tarry stools, my stool looks like tar, my poop is very dark red
    • my temperature is 103, I have a high temperature
    • I have severe pain in my belly, the pain in my stomach is severe
    • I am not passing any gas, I have not passed gas all day

    Before: a person typing one of those sentences got a provider answer. After: each produces Timmy's own byte-identical escalation copy, intercepted at the gateway before any provider call.

    The second half is the direction this boundary may never fail in. detectUrgentFlags read only the literal boolean true, so a symptom reported as 1, "yes", or "true" was read as not reported — a silently cleared symptom. The gateway's ledger sanitizer had the same strict check and could clear a browser-supplied symptom before the escalation check ran. Both now share isReportedSymptom: only an explicit clear (false, 0, "no", blank, absent) stays quiet, and escalation only ever gets broader on what the person reports.

    Near-miss wording stays quiet by test: a paper cut, blood pressure, ink on paper, black beans, black pants, dark red wine, "the road looks like tar", 98.6/37, feverfew, severe knee or back pain, mild stomach pain, "I passed gas this morning", "I have not passed my driving test", "the car has no gas".

    Completed ticket / PR

    • Issue #21 Expand deterministic symptom escalation regression suite (area/safety, priority/P0, type/test) — closed by this merge (Closes #21).
    • PR #77 fix: escalate the symptom phrasing people actually use, and never clear a reported symptom (#21) — merged to main as 3b267c0; 9 files, +430/−9, mergeable and verified before merge (its own suite run on the branch: 173/173 + syntax + diff checks). PR record closed after the merge commit landed.

    Demonstrated on camera (asserted in the browser, not just captioned)

    • There is blood when I wipe escalates — the demo types it into the real chat, then asserts exactly one new Timmy bubble carrying the app's own fixed string, with the Hermes call counter unmoved.
    • I have tarry stools escalates the same way — one red flag, one unchanging message.
    • A tarry note already saved in the journal escalates the next answer, even when the question itself is innocuous (What do my recent logs show?) — proving the ledger path is intercepted before the provider.
    • Standing paths re-verified in the same recording: photo-first consent-gated suggestion → explicit confirm → correction clearing the AI-confirmed state; hard-stool follow-up with non-diagnostic self-care and the deterministic red-flag handoff; CC0 synthetic-corpus refusals (non-stool, unreadable fields, out-of-range, blank-plus-out-of-range); vision-offline and reachable-but-unloaded fallbacks; explainable pattern summaries and the sparse-window refusal; data controls (local ledger, consent-gated upload, export, delete); Hermes chat with urgent-language interception.

    Honest boundary: this release is escalation coverage and truthfulness, not new clinical capability. No new inference, no diagnosis, no claim from the image. One acknowledged gap, noted not fixed: a provider can still place medical reassurance into the free-text observations string the suggestion card renders (escaped, beside Timmy's fixed warning) — that is a vision-response hardening item for #16/#18, deliberately outside this change.

    Tests and gates (all passed, from the release builder)

    • unit_security — npm test, 173/173 passing (adds tests/escalation-regression.test.js, 16 tests)
    • mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup, vision_corpus_refusal, worker_container_receipts, worker_post_load_readiness, longitudinal_pattern_summary — all passed
    • dependency_audit_high — npm audit --audit-level=high, 0 vulnerabilities
    • syntax, secret_scan, forbidden_artifacts — passed
    • feature_demo_media_probe — H.264 / yuv420p / 720×1280, 187.2 s, 10.77 MB; feature_demo_full_decode — complete decode, no errors
    • release_delta_visible_on_camera — the declared delta is the second caption, verified against the recording's own caption receipt (50 captions; the three new escalation captions are hard build gates)

    Video

    Recorded from the real app running at 127.0.0.1:4173 (mobile viewport 405×720, re-encoded 720×1280 H.264 yuv420p, video only, 187.2 s). Complete decode verified; contact sheet spans the whole recording; no black or blank frames. All fixtures are synthetic (CC0 corpus, fabricated ledger entries, fabricated red-flag sentences); there are no real photos, no patient data, and no credentials in the video or the archive.

    Known limitations

    • Bristol accuracy is not clinically validated. Vision output is observable-field assistance only — visible form, broad colour, image quality — with bounded confidence and abstention. It never reports symptoms or a diagnosis, and user confirmation remains mandatory.
    • Escalation is deterministic phrase coverage, so it will over-trigger before it under-triggers (fever still matches "fever blister"); narrowing is a copy question, not a safety one.
    • Pattern summaries describe correlations in your own logs, not causes; they intentionally make no claim about diet, disease, or urgency.
    • The archive intentionally excludes model weights, medical-image corpora, raw research pages, generated screenshots, and video production assets.
    Downloads
  • rockachopa released this 2026-10-14 12:11:59 +00:00 | 60 commits to main since this release

    Timmy the Talking Turd — daily review release daily-2026-10-14

    • Version: 2026-10-14-a033cb3ae9e9
    • Commit: a033cb3ae9e9993300a61eba18b499d80da798bc (merge commit of PR #76, built from a clean checkout of main)
    • Built (UTC): 2026-10-14T12:09:05Z
    • Reviewed on: America/New_York 2026-10-14
    • Source archive SHA-256: 165ec91d45cc9f1d40e55c01f9c3f76254b63c893f77f1a28e7a3cc9ab847e48
    • Demo video SHA-256: 8150ffbacd4309c188a8803828b3ee1767a218165ffe4ea7397ce6d710b92baa
    • Model / profile: operator run — Hermes Agent cron (profile default, deepseek-flash). Product vision profiles — hosted VLM and self-hosted SmolVLM2 pinned bootstrap; the pinned model must be loaded, not merely reachable, before the app offers AI. No model weights ship in this release.

    Release delta — what visibly changed since daily-2026-10-13

    The home "Timmy noticed" line was a single assertive sentence. It is now an explainable pattern summary, and it refuses to speak when the data is too thin:

    • src/summary.js builds a windowed (last 28 days) summary from confirmed ledger records only. A frequency line plus one line per Bristol grouping present in the window — and every line carries the exact confirmed record IDs it was built from.
    • Following a citation (3 records ›) opens a pattern-source sheet listing exactly those records, with the window restated and the note that changing or deleting one of them changes the line with it.
    • A window with both firm and loose logs is reported as mixed — it no longer silently reports whichever side is marginally larger.
    • Fewer than 3 confirmed logs in the window returns insufficient: true, no statements, and copy that says it is too sparse ("Not enough confirmed logs in this window yet — N of 3 needed before Timmy describes a pattern").
    • Boundary copy travels with the card: Timmy reports what you logged and when, never a cause, a food ruling, or a health verdict.

    Before: buildTimmySummary(entries) asserted a trend from whatever data existed, with no citation and no minimum. After: every claim is traceable to named records and the summary abstains below the minimum.

    Completed ticket / PR

    • Issue #34 Implement explainable longitudinal pattern summaries (area/data, area/frontend, priority/P1, type/feature) — closed by this merge (auto-closed via Closes #34).
    • PR #76 feat: explainable longitudinal pattern summaries with cited records (#34) — merged to main as a033cb3; 15 files, +398/−5, one focused commit on top of the previous release commit. PR record closed after the merge commit landed.

    Demonstrated on camera (asserted in the browser, not just captioned)

    • The journal explains its own pattern lines instead of just asserting a trend.
    • Fictional sample logs seeded into this browser's own storage — no real health data appears anywhere in the recording.
    • Every pattern line names the confirmed logs behind it, and following one shows exactly those records — the demo asserts in-browser that the "typical" citation lists exactly demo-typical-1/2/3 and throws if it does not.
    • Two logs is not a pattern: the summary refuses to describe a trend it cannot support (sparse window shows "2 of 3 needed").
    • Standing paths re-verified in the same recording: photo-first consent-gated suggestion → explicit confirm → correction clearing the AI-confirmed state; hard-stool follow-up with non-diagnostic self-care and the deterministic red-flag handoff; CC0 synthetic-corpus refusals (non-stool, unreadable fields, out-of-range, blank-plus-out-of-range); vision-offline and reachable-but-unloaded fallbacks; data controls (local ledger, consent-gated upload, export, delete); Hermes chat with urgent-language interception.

    Tests and gates (all passed, from the release builder)

    • unit_security — npm test, 154/154 passing (adds tests/summary.test.js)
    • longitudinal_pattern_summary — tests/pattern-summary.acceptance.mjs, real Chromium at 390×844
    • mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup, vision_corpus_refusal, worker_container_receipts, worker_post_load_readiness — all passed
    • dependency_audit_high — npm audit --audit-level=high, 0 vulnerabilities
    • syntax, secret_scan, forbidden_artifacts — passed
    • feature_demo_media_probe — H.264 / yuv420p / 720×1280, 163.6 s, 9.95 MB; feature_demo_full_decode — complete decode, no errors
    • release_delta_visible_on_camera — the declared delta is the second caption, verified against the recording's own caption receipt

    Video

    Recorded from the real app running at 127.0.0.1:4173 (mobile viewport 405×720, re-encoded 720×1280 H.264 yuv420p, video only, 163.6 s). Complete decode verified; contact sheet spans the whole recording. All fixtures are synthetic (CC0 corpus, fabricated multi-day ledger entries); there are no real photos, no patient data, and no credentials in the video or the archive.

    Known limitations

    • Bristol accuracy is not clinically validated. Vision output is observable-field assistance only — visible form, broad colour, image quality — with bounded confidence and abstention. It never reports symptoms or a diagnosis, and user confirmation remains mandatory.
    • Pattern summaries describe correlations in your own logs, not causes; they intentionally make no claim about diet, disease, or urgency.
    • The archive intentionally excludes model weights, medical-image corpora, raw research pages, generated screenshots, and video production assets.
    Downloads
  • rockachopa released this 2026-10-13 12:13:00 +00:00 | 62 commits to main since this release

    Timmy review release 2026-10-13-5744969faf18

    Commit: 5744969faf18036ccee1757d9d0fc2e859a72bef
    Tag: daily-2026-10-13 (America/New_York release date)
    Built (UTC): 2026-10-13T12:11:14.566739+00:00

    Release delta - what visibly changed since daily-2026-10-12

    A reachable-but-unloaded vision worker is no longer reported ready: the app shows a distinct loading state with no consent card and no AI control, and manual Bristol entry stays one tap away. (issue #15)

    Previously a worker that answered /v1/models was treated as ready - llama.cpp opens its listener before the weights are resident - so the app offered consent and Analyze visible form + color, which could only fail after the upload. Readiness now requires the pinned model to be loaded, and that state lands on manual Bristol entry in one tap.

    Demonstrated on camera (asserted in the browser, not just captioned)

    • Reachable is not loaded: no AI control, no consent, and no upload until the pinned model is resident
    • One tap still reaches manual Bristol entry while the model finishes loading
    • Once the pinned model is loaded, the same screen offers the AI analysis again
    • The pinned bootstrap verifies both model files before starting on private loopback
    • Standing paths re-verified in the same recording: photo-first consent-gated suggestion, confirmed prefill and correction; provisional suggestion states; hard-stool follow-up with deterministic red-flag handoff; CC0 synthetic-corpus refusals (non-stool, unreadable fields, out-of-range, blank-plus-out-of-range); offline vision fallback with resumable draft; Hermes chat with deterministic urgent-language interception; privacy and data-lifetime controls.

    Completed ticket / PR

    • PR #75 - feat: pin the worker container and gate readiness on the loaded model - merged to main as 5744969faf18036ccee1757d9d0fc2e859a72bef (Refs #15).
    • Issue #15 deliberately stays open: its target-GPU latency/VRAM measurement criterion is instrumented but not measured (no GPU host available, buying compute out of bounds). The container image's runtime behaviour on a CUDA host is not verified here; its pins are enforced by contract tests. No benchmark receipt is bundled.
    • Issue #73 remained verified from daily-2026-10-12.

    Model / profile

    • Vision: self-hosted SmolVLM2-2.2B-Instruct, llama.cpp pinned at 6d05498314db1b57f81c271080018aa2d0b89be9. No hosted provider is used in the recorded path.

    Gates (all passed)

    unit_security, mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup, vision_corpus_refusal, worker_container_receipts, worker_post_load_readiness, dependency_audit_high, syntax, secret_scan, forbidden_artifacts, feature_demo_full_decode, feature_demo_media_probe, release_delta_visible_on_camera.

    • Unit/security tests: 146/146
    • Browser acceptance suites: 9/9
    • Staging deploy tests: 20/20
    • npm audit --audit-level=high: 0 vulnerabilities
    • Demo re-encoded to 720x1280 H.264/yuv420p, fully decoded, media-probed.

    Artifacts and SHA-256

    • timmy-talking-turd-2026-10-13-5744969faf18.tar.gz - f412e049d96235e3d6b49ab9ed62f3591b4e478f4949de1532493eabd67cc2ba (216790 bytes)
    • timmy-talking-turd-2026-10-13-5744969faf18-demo.mp4 - d7c08e1cb47f9445aa5307dcbbc7aa253ddcf199638d728660cfc2df2e301af6 (9235200 bytes, 720x1280, H.264, yuv420p, 146.8 s)

    Known accuracy limitation

    Open-weight VLM acceptance is proven; Bristol-form accuracy is not clinically validated. Suggestions cover visible form, broad color, and image quality only - never symptoms or a diagnosis. User confirmation remains mandatory.

    Privacy

    Package excludes model weights, medical-image corpora, raw research pages, generated screenshots, and video production assets. Every visual fixture in the demo is synthetic; the corpus contains no real photos.

    Downloads
  • rockachopa released this 2026-10-12 12:07:57 +00:00 | 64 commits to main since this release

    Daily Timmy review release — 2026-10-12 (America/New_York).

    Release delta (user-visible). A vision reply that fills in one visual field and leaves the other blank no longer gets reported as an unreadable photo:

    • A blank field is still the model saying it could not read it → Timmy abstains with "No confident match / The photo does not show a form Timmy can read safely" and prefills nothing. Unchanged.
    • A filled-in field is a claim. If that claim is outside the contract (a Bristol form outside 1–7, or a colour Timmy does not accept), the reply now fails closed — "Timmy couldn't analyze that safely. No suggestion was applied. Continue manually, or try a clearer photo." — even when the other field came back blank.
    • Before this change the blank check ran first and short-circuited, so {"bristolType": 9, "color": null} abstained as unusable_visual_fields: the app told the user the photo was unreadable when the model had in fact returned a value Timmy must never apply. That escape class is now closed and covered by a corpus fixture.
    • No new authority: nothing is prefilled in either outcome, no provider text or image bytes are echoed, and a schema-valid suggestion is still the only 200-with-fields path.

    Commit. 9cf23df448 (merge commit of PR #74) targeting the daily-2026-10-12 tag on main.

    Completed ticket / PR. Issue #73 analysis.js: the blank-first ordering routes an out-of-range reply to abstain, against its own comment and the corpus's fail_closed label (P1, area/model) — closed by this merge. PR #74 fix: fail closed when a filled-in visual field is out of range (#73) — merged, 13 files, +189/−19.

    Tests and gates (all passed, from the release builder).

    • unit_security — npm test, 126/126 passing (RED first on the new case: fails closed when a field the model did fill in is out of range while another field is blank → Missing expected exception)
    • vision_corpus_refusal — npm run test:vision-refusal, corpus refusals in a real browser against a real server; now asserts the fail-closed copy and that the abstention copy is absent, on both the out-of-range and the blank-plus-out-of-range case
    • mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup
    • dependency_audit_high — npm audit --audit-level=high, 0 vulnerabilities
    • syntax, secret_scan, forbidden_artifacts
    • feature_demo_media_probe — H.264, yuv420p, 720×1280, 25 fps, 127.68 s
    • feature_demo_full_decode — complete decode, no errors
    • release_delta_visible_on_camera — the declared delta string appears in the recording's own caption receipt
    • Corpus integrity: python3 scripts/build_vision_corpus.py --verify re-hashes all 8 fixtures before packaging; every pre-existing fixture hash is byte-identical. out-of-range-fields had confidence: 1.4 and died at the confidence gate without ever reaching the range check it is named for — now 0.9, so the labelled guard is actually exercised.

    Model / profile. Self-hosted SmolVLM2-2.2B-Instruct profile (pinned bootstrap, private loopback); the hosted profile remains supported through the same request/response contract. The demo drives the real analysis code path (analyzePhoto / visionFailureResponse) and a running server.mjs, so the on-camera statuses and copy are what the server would actually send.

    Demonstrated in the video (MEDIA-first, 128 s). Happy path: one photo action → explicit consent → provisional Type 4 suggestion → confirm → correct to Type 2 → user-reported hard-stool follow-up (mild self-care, then a confirmed truly-black-and-tarry red flag on the same deterministic escalation path) → vision-offline manual fallback with a kept draft → refusal pass: a committed CC0 synthetic corpus replayed four times — a non-stool photo refused, an unreadable-fields reply abstaining, an out-of-range reply failing closed, and the new blank-plus-out-of-range reply, where the recording asserts in the browser that the fail-closed copy is shown and the "No confident match" abstention count is zero. The scene is a required caption gate in scripts/build_release.py, and the expected fail-closed 503 count was raised from one to two so the added scene cannot be dropped silently.

    Source / corpus provenance. tests/fixtures/vision-corpus/ is CC0-1.0 and fully synthetic: eight fixtures drawn deterministically by scripts/build_vision_corpus.py, each recorded in manifest.json with its sha256, byte length, case class, replayed provider reply, and required outcome. The new blank-plus-out-of-range fixture is the exact reply shape the old ordering let through. No camera, no human subject, no third-party content, no real medical imagery, and no model weights anywhere in this release.

    Hashes.

    • Source archive timmy-talking-turd-2026-10-12-9cf23df448dd.tar.gz (201,033 bytes) — SHA-256 a0622f2391abb9bbebc39a146f50b2d2ba08254d6408b8c4898cd9836fe9c177
    • Feature demo timmy-talking-turd-2026-10-12-9cf23df448dd-demo.mp4 (8,174,920 bytes) — SHA-256 f4fd718b2872f269578efdb82003e8320788068a1a89499075c9dccf4c55379a

    Verified QC. Contact sheet spanning the whole recording plus the full-resolution frame at 92 s (the delta scene) were inspected: legible copy, no clipping, no padding, no blank or black frames, no real imagery, no personal data, no diagnostic claim. The 92 s frame shows the delta caption beside the fail-closed result card and no abstention.

    Known accuracy limitation. Open-weight VLM acceptance is proven; Bristol form and colour accuracy is not clinically validated. An abstention means the reply was unusable, not that a photo cleared or confirmed anything, and a fail-closed refusal means Timmy declined to apply a claim — it is not a finding about the user's health. Suggestions stay visible-field assistance only — broad Bristol form, broad colour, image quality, bounded confidence, and abstention — never symptoms, urgency, or diagnosis, and user confirmation remains mandatory. A photo can never rule out bleeding or another cause.

    Not included. Model weights, real medical or personal images, .env/credentials, raw research pages, provider logs, and generated screenshots.

    Downloads
  • rockachopa released this 2026-10-11 12:08:29 +00:00 | 66 commits to main since this release

    Daily Timmy review release — 2026-10-11 (America/New_York).

    Release delta (user-visible). A provider reply Timmy cannot read safely is now refused in plain, user-safe words instead of surfacing as a worker failure:

    • A schema-valid reply with no readable form or colour now abstains — "No confident match / The photo does not show a form Timmy can read safely" — and prefills nothing. Previously this was thrown as Invalid AI response: visual fields are out of range and shown to the user as an analysis failure.
    • Unparsable or out-of-range replies fail closed with one shared, testable message — "No suggestion was applied. Continue manually, or try a clearer photo." No provider text, image bytes, or credentials are echoed.
    • Fail-closed replies now carry machine-readable codes (invalid_json, invalid_fields) instead of prose matching, and server.mjs maps them through visionFailureResponse().

    Commit. a1777a72e8 (merge commit of PR #72) targeting the daily-2026-10-11 tag on main.

    Completed ticket / PR. Issue #18 Build schema-conformance and real-stool refusal regression corpus — closed by this merge. PR #72 test: prove schema conformance and refusal with a committed vision corpus (#18) — merged, 30 files, +1108/−34.

    Tests and gates (all passed, from the release builder).

    • unit_security — npm test, 122/122 passing (adds tests/vision-corpus.test.js, tests/vision-boundary.test.js)
    • vision_corpus_refusal — npm run test:vision-refusal, corpus refusals in a real browser against a real server
    • mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup
    • dependency_audit_high, syntax, secret_scan, forbidden_artifacts
    • feature_demo_media_probe — H.264, yuv420p, 720×1280, 25 fps, 120.76 s
    • feature_demo_full_decode — complete decode, no errors
    • release_delta_visible_on_camera — the declared delta string appears in the recording's own caption receipt
    • Corpus integrity: python3 scripts/build_vision_corpus.py --verify re-hashes every fixture before packaging

    Model / profile. Self-hosted SmolVLM2-2.2B-Instruct profile (pinned bootstrap, private loopback); the hosted profile remains supported through the same request/response contract. The demo drives the real analysis code path (analyzePhoto / visionFailureResponse) and a running server.mjs, so the on-camera statuses and copy are what the server would actually send.

    Demonstrated in the video (MEDIA-first, 121 s). Happy path: one photo action → explicit consent → provisional Type 4 suggestion → confirm → correct to Type 2 → user-reported hard-stool follow-up (mild self-care, then a confirmed truly-black-and-tarry red flag on the same deterministic escalation path) → vision-offline manual fallback with a kept draft → then the new refusal pass: a committed CC0 synthetic corpus replayed three times — a non-stool photo refused ("No confident match"), an unreadable-fields reply that now abstains instead of erroring, and an out-of-range reply that fails closed and applies nothing.

    Source / corpus provenance. tests/fixtures/vision-corpus/ is CC0-1.0 and fully synthetic: seven fixtures drawn deterministically by scripts/build_vision_corpus.py, each recorded in manifest.json with its sha256, byte length, case class, replayed provider reply, and required outcome. No camera, no human subject, no third-party content, no real medical imagery, and no model weights anywhere in this release.

    Hashes.

    • Source archive timmy-talking-turd-2026-10-11-a1777a72e80e.tar.gz (196,566 bytes) — SHA-256 9152d3205c728393dffa386f7f2efaf6ff52775ad66cba280d670b05bd3d11e9
    • Feature demo timmy-talking-turd-2026-10-11-a1777a72e80e-demo.mp4 (8,039,211 bytes) — SHA-256 d7087c0e3d18b8782ee927bba73cc2d6447da44e62c13d4a401995b6d9564747

    Known accuracy limitation. Open-weight VLM acceptance is proven; Bristol form and colour accuracy is not clinically validated. An abstention means the reply was unusable, not that a photo cleared or confirmed anything. Suggestions stay visible-field assistance only — broad Bristol form, broad colour, image quality, bounded confidence, and abstention — never symptoms, urgency, or diagnosis, and user confirmation remains mandatory. A photo can never rule out bleeding or another cause.

    Not included. Model weights, real medical or personal images, .env/credentials, raw research pages, provider logs, and generated screenshots.

    Downloads
  • rockachopa released this 2026-10-10 12:19:55 +00:00 | 68 commits to main since this release

    Timmy review release daily-2026-10-10

    Source commit: 58b7fed (built from a clean checkout of main)
    Build date (UTC): 2026-10-10
    Release delta: Documentation and test-gate release: photo data-flow threat model (issue #20) and the test that enforces it. No user-visible feature changed.

    Completed ticket / PR

    • Issue #20 (area/privacy, priority/P0, type/security) — "Write the end-to-end photo data-flow threat model" — closed by PR #71, merged as 503efaf.
    • This release also carries the release-gate work that makes the delta statement provable on camera: d027a1e, 58b7fed.

    What the video demonstrates

    Recorded from the working app at a 405x720 mobile viewport, re-encoded to 720x1280 H.264 yuv420p, video only, 96.3 s, full decode verified, contact sheet spanning the whole recording.

    • The release delta stated on camera as the second caption.
    • Photo-first flow: consent-gated upload, provisional suggestion (Type 4, 83% confidence), explicit confirm, correction to Type 2, and the AI-confirmed state clearing on correction.
    • Bristol 1-2 follow-up covering soreness, hydration, visible blood, and black-or-tarry; mild self-care copy; the deterministic red-flag path firing only on a confirmed black/tarry answer and clearing when the answer changes.
    • Vision-offline path: AI and consent steps removed, manual Bristol entry one tap away, in-session draft retained, start-over clears it.
    • The byte-bearing controls the threat model governs, shown live with the app's real selectors: local-only ledger, consent-gated upload, Export JSON / Import JSON, Delete all local data.
    • Hermes chat: contextual free-text reply over confirmed logs, and urgent language intercepted deterministically before Hermes.

    Verified gates (all passed)

    • 112/112 unit + security tests (npm test), including the new tests/threat-model.test.js enforcement.
    • Browser acceptance flows: mobile green path, photo-first, sleek Hermes chat, mobile capture recovery, manual fallback + draft recovery, provisional suggestion states, hard-stool follow-up.
    • npm audit --audit-level=high — 0 vulnerabilities; syntax gate; secret scan; forbidden-artifact allowlist; local acceptance server booted from the packaged commit.
    • Release-demo gates: on-camera delta receipt (the demo emits a machine-readable record of every caption it rendered and the build refuses to publish if the delta or any required feature caption is absent), one H.264 720x1280 yuv420p video stream, complete MP4 decode, contact sheet present and spanning the full recording.

    Model / profile

    • Vision profile selfhost — self-hosted SmolVLM2-2.2B-Instruct over private loopback; the pinned bootstrap verifies both model files before starting. The demo shows that profile ready, then flips the app's own readiness contract to exercise the offline path.
    • Chat — Hermes Agent with server-side session continuity; the demo uses a deterministic fixture reply. No browser credentials, session IDs, or photos enter chat.

    Hashes

    • Source archive timmy-talking-turd-2026-10-10-58b7feddc817.tar.gz — SHA-256 ee5ae337968b9475a5d62f9a7e5d75a0ca7edb2db7808a2db34a1784bd2c01ef (150218 bytes)
    • Demo video timmy-talking-turd-2026-10-10-58b7feddc817-demo.mp4 — SHA-256 f04958415906eab9ef49cd21285741da1aae47ec207a3cf87d0389c39a5d1fe2 (6369674 bytes)

    Known accuracy limitation

    Open-weight VLM acceptance is proven; Bristol accuracy is not clinically validated. The app suggests only visible form, broad color, and image quality — never symptoms and never a diagnosis — and user confirmation stays mandatory. Host compromise, hosted-provider retention profiles, and model accuracy remain accepted residual risks with named owners in the threat model, not eliminated ones.

    Downloads
  • rockachopa released this 2026-10-09 12:07:26 +00:00 | 72 commits to main since this release

    Timmy the Talking Turd — review release daily-2026-10-09

    • Version: 2026-10-09-5505f3c3eff2
    • Commit: 5505f3c3eff2978cb11c0607e9bf5236e12aa588
    • Built (UTC): 2026-10-09T12:05:33Z
    • Reviewed on: America/New_York 2026-10-09

    Tangible change

    Hard/lumpy (Bristol 1–2) entries now open a short user-reported follow-up on the existing safety step, before saving: hard/difficult to pass, soreness or sharp pain afterwards, visible red blood, truly black/sticky/tarry versus just dark brown, and dehydration/dark urine. Nothing is inferred from the photo and every question starts unanswered.

    • A confirmed visible red blood answer sets the existing blood red-flag; a confirmed truly black/sticky/tarry answer sets the existing blackOrDarkRed red-flag — both land on the same deterministic escalation path manual logging already uses, and the alert clears the moment the answer changes.
    • Answering dark brown (or skipping the question) never escalates: a draft colour value is not evidence.
    • A mild report gets concise non-diagnostic self-care (steady hydration, no straining, gentle cleaning, warm sitz bath, external barrier ointment, food-based fibre) plus an explicit "general self-care, not a diagnosis — your photo cannot rule out bleeding or another cause" note.
    • The follow-up appears only for Type 1–2 forms; other forms are unchanged, and the photo-suggestion surface remains provably symptom-free.

    Tests / gates (all passed)

    unit_security, mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, hard_stool_followup, dependency_audit_high, syntax, secret_scan, forbidden_artifacts, feature_demo_full_decode, feature_demo_media_probe.

    • npm test → 104 pass / 0 fail
    • npm run test:followup (real browser, 390x844) → PASS; the other six acceptance flows re-run green (no regressions)
    • npm audit --audit-level=high → 0 vulnerabilities
    • Demo MP4 completely decoded; media probe 720x1280 H.264 / yuv420p

    Artifacts

    • Source archive timmy-talking-turd-2026-10-09-5505f3c3eff2.tar.gz — sha256 7064adb110a1a1d8750b6c8934ec9a201df555d700d95c1bb7f6faec88904795
    • Demo video timmy-talking-turd-2026-10-09-5505f3c3eff2-demo.mp4 (720x1280, H.264, yuv420p, 75.2s, silent captioned screencast) — sha256 24660496d5682dba01cd456716365c1aef0d93ad61334ee9508509e74355f390

    Model / profile

    Self-hosted vision profile SmolVLM2-2.2B-Instruct (pinned bootstrap, both model files verified before start); the hosted profile is also supported. The demo was recorded from the real running app against the self-hosted profile using deterministic synthetic fixtures — a generated sticker-style test image and hand-entered answers. No real medical images and no real user data are in this release.

    Completed ticket / PR

    • Issue #67 (Field finding: hard-stool photo should trigger soreness, hydration, and tarry-colour follow-up) — closed by the merge.
    • PR #70 merged into main as commit 5505f3c; Gitea again left the PR merged flag unset, so the PR record was closed explicitly after the commit landed on main.

    Demonstrated features (video)

    • Home → photo log → camera/gallery → explicit consent → AI suggestion (AI SUGGESTION, provisional) → confirm → correct to Type 2 (CORRECTED BY YOU).
    • Hard-stool follow-up appears for Type 2 with the five user-reported questions; a skipped question stays unanswered.
    • Mild report renders "Mild report — general self-care, not a diagnosis." with the "your photo cannot rule out bleeding" line.
    • Setting truly black, sticky, or tarry = Yes checks the red flag and renders the "Pause and get medical help" emergency guidance; switching it to No clears both.
    • Vision worker offline: consent/upload steps disappear, one-tap manual Bristol entry keeps the corrected draft.
    • Timmy chat over confirmed logs, with urgent language intercepted deterministically before Hermes.

    Known accuracy limitation

    Open-weight VLM acceptance is proven; Bristol form/colour accuracy is not clinically validated. The AI suggests only visible Bristol form, broad colour, and image quality — never symptoms and never a diagnosis. Everything the follow-up asks is user-reported, user confirmation stays mandatory, and the emergency path is deterministic rather than model-driven.

    Downloads
  • rockachopa released this 2026-10-08 12:07:53 +00:00 | 74 commits to main since this release

    Timmy the Talking Turd — review release daily-2026-10-08

    • Version: 2026-10-08-7c5c466b8361
    • Commit: 7c5c466b83614ce2aa680c0a1b65b4160e415b4f
    • Built (UTC): 2026-10-08T12:06:15Z

    Tangible change

    AI suggestions are now a distinct, provisional state everywhere they appear, and correcting one clears the AI-confirmed state without losing anything the user entered. Three visually and semantically distinct states: AI SUGGESTION (dashed, provisional, "not applied yet") → AI PREFILLED (explicitly confirmed by the user) → CORRECTED BY YOU (user overruled the model). Changing a suggested value flips affirmed to false while retaining urgency, discomfort, note, photo, and colour.

    Tests / gates (all passed)

    unit_security, mobile_green_path, photo_first_acceptance, sleek_hermes_chat_acceptance, manual_fallback_draft_recovery, provisional_suggestion_state, dependency_audit_high, syntax, secret_scan, forbidden_artifacts, feature_demo_full_decode, feature_demo_media_probe.

    • npm test → 92 pass / 0 fail
    • npm audit --audit-level=high → 0 vulnerabilities
    • Demo MP4 fully decoded; media probe 720x1280 h264/yuv420p.

    Artifacts

    • Source archive timmy-talking-turd-2026-10-08-7c5c466b8361.tar.gz — sha256 bc67818f5b1224c09bfaa60a2737baba55477187f9d71b746705c7eb4177a91e
    • Demo video timmy-talking-turd-2026-10-08-7c5c466b8361-demo.mp4 (720x1280, H.264, yuv420p, 51.8s) — sha256 41ecaaf25c9ad45f23e7a95f76fb53a595e9307c8a4441bf90e80379caeb07d8

    Model / profile

    Self-hosted vision profile SmolVLM2-2.2B-Instruct (pinned bootstrap); hosted profile also supported. Demo recorded from the real running app against the self-hosted profile using a deterministic, synthetic fixture (no real data).

    Completed ticket / PR

    • Issue #13 (Make AI suggestions visibly provisional and correction-first) — closed.
    • PR #69 merged into main as commit 7c5c466 (Gitea left the PR's merged flag unset; the commit is on main and the PR record was closed manually).

    Demonstrated features (video)

    • Provisional suggestion: "Suggested Type 4, brown — provisional and not applied yet. You choose whether to use it."
    • Explicit confirmation → AI PREFILLED ("you confirmed it").
    • Correction to Type 2 → CORRECTED BY YOU ("your values are saved, not the suggestion").
    • Vision worker offline → consent and upload steps disappear; one-tap manual Bristol entry; corrected draft retained.
    • Timmy chat over confirmed logs with deterministic urgent-language interception before Hermes.

    Known accuracy limitation

    Open-weight VLM acceptance is proven; Bristol form/colour accuracy is not clinically validated. The AI suggests only visible Bristol form and broad colour — never symptoms or a diagnosis. User confirmation remains mandatory. Demo data is entirely synthetic.

    Downloads
  • rockachopa released this 2026-10-07 12:06:53 +00:00 | 76 commits to main since this release

    Timmy the Talking Turd — daily review release 2026-10-07

    • Version: 2026-10-07-3e87f881c57c
    • Commit: 3e87f881c57cee928c18d00ba5b1d1ebe2637021
    • Prerelease for human review on Telegram; human RC approval remains the ship gate.

    Tangible change since the 2026-08-27 release (5dac04b1e609)

    Logging no longer depends on AI availability, and an unsaved entry is not lost by recoverable navigation (PR #68, closes issue #12):

    • Offline/provider-down reaches manual Bristol entry in one action. When the vision worker is offline, disabled, or still unknown, the analyze control and consent prompt are not rendered at all — no dead control, no consent for an upload that cannot happen — and manual entry is the primary action.
    • Draft owns the photo and entered context. Closing the sheet, switching views, and reopening the logger resume the same draft with a visible kept-draft summary and an explicit Start over.
    • Service worker never caches analysis requests or image bodies. api/ stays network-only and image/* responses are refused.
    • Drafts stay in session memory only, never in storage, so a photo awaiting consent is not persisted (documented in docs/PRODUCT-DECISIONS.md).

    Demonstrated in the attached video (42 s, 720x1280, H.264 yuv420p, 25 fps)

    • Home → one dominant photo action, manual logging one tap away
    • Self-hosted SmolVLM2-2.2B-Instruct reported ready on private loopback
    • Camera close recovery with no upload
    • AI suggestion (83% confidence) with "not a diagnosis" language; the user reviews before saving (prefilled Type 4 · brown)
    • Vision worker offline → AI and consent steps absent, ready-for-review path, no upload
    • One tap to manual Bristol entry with the kept draft Type 4 · photo and explicit Start over
    • Hermes chat with server-side session; urgent language intercepted deterministically before Hermes
    • Synthetic demo data only (synthetic-Type-4 fixture, deterministic vision/chat responses). No real imagery.

    Gates (all passed)

    unit_security (81/81) · mobile_green_path · photo_first_acceptance · sleek_hermes_chat_acceptance · manual_fallback_draft_recovery · dependency_audit_high (0 vulnerabilities) · syntax · secret_scan · forbidden_artifacts · feature_demo_full_decode · feature_demo_media_probe.

    Artifacts

    • Source archive timmy-talking-turd-2026-10-07-3e87f881c57c.tar.gz — sha256 914cd471babcb6fa842ea379a282a674e78e274f43fffb5d2ccc2e252647ae22 (132,223 bytes)
    • Feature demo timmy-talking-turd-2026-10-07-3e87f881c57c-demo.mp4 — sha256 b36d0ad8b2018004235680620ef8587c58f9d8e863d29dd193eeea5bf4eab5e6 (2,987,126 bytes)

    Model / profile

    Self-hosted SmolVLM2-2.2B-Instruct via the pinned bootstrap; the hosted profile is also supported. The acceptance run uses TIMMY_VISION_ENABLED=false and the demo replays the app's own readiness contract.

    Completed work

    Issue #12 (closed) · PR #68 (merged into main as 3e87f881c57cee928c18d00ba5b1d1ebe2637021).

    Known accuracy limitation

    Open-weight VLM viability is proven; Bristol-form accuracy is not clinically validated. Suggestion output is limited to visible form, broad color, image quality, and bounded confidence with abstention — never symptoms or a diagnosis. User confirmation remains mandatory, and drafts do not survive a reload.

    Downloads
  • Timmy daily review — 2026-08-27
    Quality gates / quality (push) Successful in 1m56s
    Pre-Release

    timmy released this 2026-08-27 13:15:36 +00:00 | 78 commits to main since this release

    Verified rebuild; no source change

    A fresh, fully gated rebuild of current main. The source commit is unchanged from the previous dated release.

    Demonstrated feature path

    • Mobile camera/picker cancellation recovers cleanly.
    • Gallery and manual logging remain immediately available.
    • Explicit consent precedes the synthetic photo-analysis request.
    • AI is limited to a provisional visible Bristol form, broad color, image quality, and bounded confidence; the user must review and confirm.
    • Hermes chat uses server-side session continuity and excludes photos.
    • Urgent language is intercepted deterministically before Hermes.

    Release evidence

    • Exact commit: 5dac04b1e6097563afac469ac399a301a7d8d86a
    • Completed ticket / PR represented on current main: issue #11 / PR Harden mobile camera and gallery recovery (#66)
    • Model/profile shown in synthetic demo: SmolVLM2-2.2B-Instruct / selfhost
    • Source archive SHA-256: 9318d7235a96ad5d880d435d56044c29f8353ea77d62aab3930ad842abb4dee0
    • Demo video SHA-256: 0fa4a68003e73048c3a8aec344532c823b18dc0488f2c98fd111471f05f975f5

    Passed gates

    Unit/security tests; mobile green path; photo-first acceptance; mobile capture recovery; sleek Hermes chat acceptance; high-severity dependency audit; syntax checks; secret scan; forbidden-artifact scan; actual browser recording; H.264 720×1280/yuv420p probe; complete MP4 decode; contact-sheet and full-resolution-frame visual QC.

    Known accuracy limitation

    The open-weight VLM integration path is demonstrated with clearly synthetic fixture data. Bristol accuracy is not clinically validated. Timmy does not diagnose disease; user confirmation remains mandatory.

    Downloads