Hard-stool follow-up: user-reported symptoms with deterministic red-flag handoff #70
Closed
rockachopa
wants to merge 0 commits from
timmy/67-hard-stool-followup into main
pull from: timmy/67-hard-stool-followup
merge into: stackchain:main
stackchain:main
stackchain:timmy/19-metrics-operator-report
stackchain:timmy/16-image-ingress-hardening
stackchain:timmy/40-security-rc-evidence
stackchain:timmy/27-dataset-card
stackchain:timmy/26-review-adjudication
stackchain:timmy/32-abstention-policy
stackchain:timmy/29-evaluation-harness
stackchain:timmy/35-portable-backup-versions
stackchain:timmy/24-training-contribution-consent
stackchain:fix/demo-caption-pixels
stackchain:timmy/36-photo-lifecycle-controls
stackchain:timmy/release-notes-grounded-chat
stackchain:timmy/37-grounded-chat-citations
stackchain:timmy/21-escalation-regression
stackchain:timmy/34-explainable-pattern-summaries
stackchain:timmy/15-container-worker-receipts
stackchain:timmy/73-blank-first-ordering
stackchain:timmy/18-vision-corpus
stackchain:timmy/20-photo-dataflow-threat-model
stackchain:timmy/13-provisional-suggestion-state
stackchain:timmy/12-manual-fallback-draft-recovery
stackchain:timmy/11-mobile-capture-recovery
stackchain:free/hy3-timmy-16
stackchain:timmy/35-version-ledger-migrations
stackchain:timmy/41-release-observability-dashboard
stackchain:free/step-timmy-14
stackchain:timmy/21-escalation-regression-suite
stackchain:timmy/17-bounded-inference-queue
stackchain:timmy/58-strict-csp-runtime-config
stackchain:timmy/55-staging-deployment-tooling
stackchain:timmy/53-private-subpage-staging
stackchain:timmy/10-reproducible-smolvlm-bootstrap
stackchain:timmy/48-vomiting-phrase-hotfix
stackchain:timmy/48-server-safety-override
stackchain:timmy/47-sleek-hermes-agent
stackchain:timmy/9-product-boundary-decisions
stackchain:timmy/8-ci-gates
No Reviewers
Labels
Clear labels
area/backend
area/data
area/frontend
area/model
area/privacy
area/release
area/safety
blocked
human-gate
priority/P0
priority/P1
priority/P2
state:review
type/docs
type/epic
type/feature
type/ops
type/research
type/security
type/test
Application API and storage
Dataset and provenance
PWA and interaction design
Vision model and inference
Privacy and consent
Release engineering and distribution
Clinical safety boundary
Blocked on an explicit dependency or decision
Requires explicit human approval
Release-critical
High priority
Planned
Documentation and evidence
Roadmap epic
Product feature
Infrastructure and operations
Research or evaluation
Security hardening
Verification and quality gate
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stackchain/timmy-talking-turd#70
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #67
What changed
A hard/lumpy (Bristol 1-2) entry now asks a short follow-up before saving: hard/difficult to pass, soreness or sharp pain afterward, visible red blood, truly black/sticky/tarry versus dark brown, and dehydration/dark urine. Every question starts unanswered, is user-reported, and is never inferred from the photo.
bloodsymptom flag; confirmed truly black/tarry writes the existingblackOrDarkRedflag. Both therefore trigger the same deterministic alert manual logging already uses, and clearing the answer clears the escalation.colorvalue is not evidence.Evidence (this branch, commit
4cc5f4f)npm test— 104/104 pass from a clean checkout (was 92; +9 follow-up unit, +3 contract/release-demo assertions).npm run test:followup— PASS (tests/followup.acceptance.mjs, real browser at 390x844).npm run test:ui,test:photo,test:mobile-capture,test:sleek,test:manual-fallback,test:provisional— all PASS (no regressions).npm run check:syntax— PASS, includingsrc/followup.jsand the new acceptance script.scripts/record_release_demo.mjs— recorded end to end against the working app (/tmp/timmy-demo-verify.webm, 71.8s, no browser errors) exercising the follow-up block, the mild self-care output, and the black/tarry → deterministic alert handoff with synthetic data only.artifacts/followup-hard-stool-mobile.png.RED/GREEN discipline
The unit contract was written first and observed failing (
ERR_MODULE_NOT_FOUND: src/followup.js), then implemented to green. The browser acceptance was written next and observed failing (waiting for locator('[data-followup-block]')on the unwired app), then the app was wired to green. The suite also caught a real bug during that cycle: unchecking the mirrored red flag on a non-hard form left a stale alert because the refresh returned early when the follow-up block was absent.Deliberate scope limit
Mild answers (difficulty passing, soreness, dehydration) drive the guidance but are not persisted: saving them would change the ledger schema, which #35/#61 already own. Follow-up as a separate ticket rather than a schema change on a safety PR.
Boundary
No change to the medical/non-diagnostic boundary: analysis still suggests visible form, broad color, and quality only; the follow-up adds user-reported answers, adds no new escalation keys, and reuses the canonical urgent copy from
src/domain.js. No real medical images, no model weights, no infrastructure purchase, no production service change.Pull request closed