Guarantee manual fallback without AI and in-session draft recovery (#12) #68
Closed
rockachopa
wants to merge 0 commits from
timmy/12-manual-fallback-draft-recovery into main
pull from: timmy/12-manual-fallback-draft-recovery
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/67-hard-stool-followup
stackchain:timmy/13-provisional-suggestion-state
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#68
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 #12
Outcome
Logging never depends on AI availability, and an unsaved entry is not lost by recoverable navigation.
Acceptance criteria
src/vision-readiness.jsgives the photo flow a single readiness contract. When the worker is offline, disabled, or still unknown, the analyze control and the consent prompt are not rendered at all (no dead control, no consent for an upload that cannot happen), and the manual CTA is the primary action on the pick, ready, and error steps.src/draft.jsmakes the draft own the photo and 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.api/stays network-only and the fetch handler now also refuses to persistimage/*responses.Privacy/safety disposition
Drafts are deliberately held in session memory only, never written to storage, so a photo awaiting analysis consent is not persisted. A reload starts clean; this is recorded in
docs/PRODUCT-DECISIONS.md("Availability and draft retention"). No AI field, escalation rule, or non-diagnostic boundary changed.Evidence
npm test: 81/81 pass (addstests/draft.test.js,tests/vision-readiness.test.js)python3 tests/staging-deploy.test.py: 20/20 OKtest:ui,test:photo,test:mobile-capture,test:sleek, and newtest:manual-fallbackall passnpm run check:syntax,npm run check:diff: cleanDemo path
scripts/record_release_demo.mjsnow flips the app's own readiness contract mid-recording and visibly replays: vision offline -> no consent/no upload -> one tap to manual Bristol entry -> kept draft (Type 4 * photo) -> start over. It asserts the retained draft on the live DOM, andtests/release-demo.test.jslocks the captions. Verified locally: the recording decodes end to end and OCR of the recorded frames shows the offline ready screen and the kept-draft banner.Not merged; release candidate approval stays a human gate.
Merged into main as merge commit
3e87f881c5(headdce668e72b).Pre-merge verification on
dce668ein an isolated clone: npm test 81/81 pass; browser acceptance flows ui, photo-first, mobile-capture, sleek-chat, and manual-fallback all PASS; diff scanned for secrets and forbidden artifacts (none); added artifacts/ PNGs are app-UI screenshots of the synthetic flow, not real imagery.Closing this PR record so the forge matches main.
Pull request closed