Swasti · mForm V2→V3
Days to deadline
Build 1.0.0+48 is going to PRODUCTION — the first production release since 1.0.0+36 in July, carrying twelve builds of accumulated fixes. The one that matters most on the ground: Livelihood would not sync at all for surveyors who had recorded goat-purchase data, and had not since 24 July. Four Livelihood child tables are named with integers rather than text, and the sync engine aborted the whole doctype the moment it met one, so those surveyors kept everything queued on their phones. Also reaching surveyors for the first time in production: a record the server rejected can now be corrected on the phone through Fix & resync on every form, not just a Member profile; required fields are genuinely enforced, including fields further down a form nobody scrolled to, which is why members were syncing through with a blank Village; sync failures are explained in plain words instead of raw server text; members can be found by mobile number from any list; and an impossible haemoglobin reading is refused at entry rather than stored. The production build is being cut by DevOps and will be verified by us as an APK before the Play Store release is created. Server-side fixes from the same period — follow-up ordering and Health range enforcement — are a separate deployment and do NOT go out with this build.
Full BRD-compliance audits run form-by-form (Health → Scheme → Document), each fixed and shipped to the Dhwani Firebase group on staging. Health Screening reconciled to the clinical BRD (BP-2 overrides BP-1, age<13 BP rule, re-screening §10 gating, server-side conditional-mandatory). Scheme: follow-up mandatory fields fixed (the 'didn't check status' path no longer fails on sync), Approved-awaiting cadence corrected to 15 days, Trans members now match schemes (Trans→Other), VS25 attachment gate added. Document (24 June): Form-2 sequential 3-step gate + re-application-after-closure fixed; Form-3 Follow-up rebuilt to the BRD §11 7-code status taxonomy with BOTH twice-rules (Twice-Delay + Twice-Approved-No), the conditional fields (rejection reason, attachment gate, final attachment) and server-side validation. Offline→sync verified on-device for both follow-ups + the document application. Six-language translations seeded for all new strings (AI drafts — native-speaker review pending before UAT/prod). Known follow-up: a Scheme Application saved as Draft without 'interested to apply' is now guarded (fix queued for the next drop).

Form status

One row per form. 6 done · 0 in flight · 0 rebuild planned · 0 pending.

Member Profiling
V2 form 1000
Done
Rebuilt against the PM video. Single-scroll layout with consent gate at top, auto-populating donor/partner, Get-button for facilitator, household-member-count field, and post-submit routing on Civic ID.
Done
  • Doctype + server validation
  • Offline-first save → outbox → REST push
  • DOB picker + auto-calc Age
  • Phone (10-digit), validation engine
  • Single-scroll layout in V2 viewSequence order
  • Consent gate at top with popup (red → green states)
  • Donor and Partner auto-populate on Grampanchayat select
  • Individual Facilitator Get button (pulls logged-in user)
  • Household members count field added
  • Conditional disability fields and other-ID slots properly gated
  • Post-submit routing: Civic ID Yes → Scheme, No → Document Application
  • Save now blocks required fields inside the collapsed Additional Details section (29 May)
  • Required-field rules now driven by Frappe meta — PMs can change reqd / mandatory_depends_on without an app rebuild (29 May)
  • Older app data self-heals on bootstrap — phones carrying state from before the SDK upgrade earlier this month now save members again without needing to clear the app (31 May)
Next
  • Tester-verified end-to-end. No open items.
Scheme Application
V2 form 1002
Done
Rebuilt against the PM video. Single-scroll layout with top read-only display, collapsible Beneficiary / Scheme / Document Verification sections, offline-eligible scheme picker, About-this-scheme auto-fill card with documents-coverage hint, and Filled/Submitted/Verified progress chips. Offline-first save through outbox.
Done
  • Doctype scaffolded
  • ADD screen on shared form primitives (SwastiSelectField etc.)
  • Offline applicable-schemes filter (7 dimensions: state/gender/caste/marital/occupation/age/income)
  • 16-state V2 master refresh (was 7 states) — covers Haryana, Bihar, Maharashtra, Delhi, Gujarat, Nagaland, Meghalaya, Mizoram, Tripura, Kerala in addition to the original 7
  • V2 PM-spec rebuild: X / 3.1 Scheme Application / SAVE DRAFT header; single long scroll; 3 transparent-collapsible sections with top dividers
  • About-this-scheme card: description, clickable scheme link (url_launcher), beneficiary's documents, required documents, Civic ID — with green/ochre missing-docs coverage hint
  • Followup-in (15/30/60 Days) → derived Follow Up Due date
  • Three-stage Filled / Submitted / Verified chips replace the single workflow_status pill
  • Offline-first save: docs__scheme_application + outbox INSERT, never direct API
  • Geography fields dropped from doctype (denormalized — inherit through member link); individual_facilitator retargeted Link User
  • Eligible Schemes picker fix — was showing No matches for everyone post-SDK-upgrade; query now uses the v2 child-table schema (31 May)
  • Applied scheme cards on member detail are tappable — opens scheme detail with the Add Follow-up CTA (31 May)
Next
  • RESOLVED (29 July) — SWF-2026-69113: the short scheme list was not an app filter bug. A geography permission on the server was blocking read access to multi-state scheme records, so the app only ever received the handful scoped to the member's own state. Corrected on both staging and production; a Maharashtra member now sees the full 185-scheme list instead of 7, verified on a real production phone. Surveyors pick it up by re-syncing masters from Settings — no app update needed. See note 13.
Scheme Followup
V2 form 1003
Done
Built against the PM video. Multi-visit follow-ups against a saved Scheme Application; status auto-derives from Application Status + Benefit Received; marking a visit Delayed pushes the due date 30 days. Visit history cards on the scheme detail screen, each tappable for the full breakdown.
Done
  • Doctype scaffolded as child-style follow-up of Scheme Application
  • ADD screen on shared form primitives
  • Derived status from the PM truth table (Application Status × Benefit Received)
  • Auto-reschedule due date +30 days on Delayed
  • Evidence image upload (only when benefit received)
  • Offline-first save against an unsynced parent (outbox resolves the link at push)
  • Expandable visit-history cards on the detail screen
Next
  • Tester-verified end-to-end. No open items.
Document Application
V2 form 1004
Done
Rebuilt to mirror the Scheme Application shape — single long scroll, Document Verification with Filled / Submitted / Verified stages, acknowledgement number, and a follow-up due date. The 'Select document to apply' picker is the PM-curated 17-item list (12 civic IDs + 5 apply-only docs).
Done
  • Doctype scaffolded
  • Stage-1 ADD screen using shared form primitives
  • 17-item applyable-document picker (is_applyable_document flag on Document Master)
  • Filled / Submitted / Verified stage chips + conditional submission date
  • Offline-first save through outbox
  • Pick Document picker fix — was failing with an ORDER BY database error; now lists the curated set as intended (31 May)
  • Applied document cards on member detail are tappable — opens document detail with the Add Follow-up CTA (31 May)
Next
  • Tester-verified end-to-end. No open items.
Document Application Followup
V2 form 1005
Done
Multi-visit follow-up flow mirroring Scheme Follow-up. Status derives from application progress; offline-first save against an unsynced parent.
Done
  • Doctype scaffolded + controller
  • ADD screen on shared primitives
  • Derived status + visit history cards
  • Offline-first save (parent-link resolution at push time)
Next
  • Tester-verified end-to-end. No open items.
Health Screening
V2 form 1010+1011
Done
Greenfield rewrite from the PM walkthrough (note 12). Split into three doctypes — screening, follow-up, re-screening. Single long-scroll form with live status pills for BMI, Haemoglobin, Blood Pressure and Blood Sugar that derive as the surveyor types, plus interpretation text. Three follow-up visits (each a different question set) and a re-screening flow.
Done
  • Three doctypes: Health Screening V3 / Followup / Rescreening
  • Twin threshold modules (Python + Dart) for BMI / Hb / BP / RBS — identical bands, parity-tested
  • Single-scroll ADD screen: Demographics, BMI, Hb, BP (1+2 readings, final = max severity), Blood Sugar, Healthy Days, Illness & Referral
  • Live status pills + interpretation text derive on input
  • Decimal weight / height / Hb input (per V2)
  • Disabled inherited from the Member profile (not re-asked)
  • Full V2 question text for Healthy Days + Illness sections
  • Three visit-specific follow-up forms + re-screening labs
  • Classification pills + expandable visit-history cards on the detail screen
  • Offline-first save and follow-ups against an unsynced parent
  • PM Excel tracker drained: Batches A–E (range hints, imported read-only fields, live BMI/BP, Visit 2 hoisting, Expressed Illness multi-select, numbering) — 3 June
  • SWF-132 home count fix + SWF-133 FU stale-status fix — 4 June
Next
  • Confirm with PM whether re-screening should lock until after Visit 3
  • Wire WHO Z-score reference values for child BMI bands (5–18 yr)
Livelihood
Greenfield (no V2 source)
Greenfield. Backend (5 DocTypes, status module, manifest patch _017) and Flutter UI (application + 2 follow-up types + detail screen with 6 collapsible sections, stage chips, due-date hint) built and on-device verified. PM (Shweta) resolved all open questions 2026-05-27. Save + full offline sync working after the app-side child-table v2 schema migration shipped.
Done
  • PM Miro design captured
  • PM (Shweta) resolved all 9 open questions (A–I) — 2026-05-27
  • Frappe backend committed (mform_swasti 46f84f2): 5 DocTypes + status module + _017 manifest patch
  • Flutter UI committed (swasti_flutter ce05c12): application + goat-purchase FU + repayment FU, detail screen, listing card with stage chips and due-date hint
  • Child-table sync (#186) resolved app-side: child-table v2 schema migration + matcher rewrite to parent_uuid
  • On-device verified end-to-end: save → outbox → push → server confirm
  • SWF-126/127/128 — workflow close on loan-fully-repaid + Defaulted-month skip-logic + option rename (4 June)
  • SWF-139/140 — Goat-then-Repayment sequence gate + Defaulted is non-terminal (5 June)
Next
  • 3 latent reqd:1 traps on Repayment FU JSON (amount_received, goat_insurance, repayment_date) — next sprint
  • SWF-106 — blocked on backend mobile_created_at schema (Task #138)

Recent milestones

Newest first. Each milestone is a self-contained deliverable.

August 2026
11
Aug
Build +52 — Forms record when they were filled, and follow-up history stops shuffling milestone
**Every form now records the moment it was captured, on the phone.** A form filled in a village with no signal on Monday and synced on Thursday was stamped Thursday, in sync order — and that date is what every date-filtered export and every follow-up history reads from. All eleven forms now carry the real capture time, taken from the handset at the moment of saving, including partial saves. Existing records keep the date they already had; nothing is rewritten. **Follow-up history no longer reorders itself after a sync.** The list was ordered by a timestamp that a sync rewrites, so pulling a batch restamped a whole history at once and reshuffled it — and because a scheme or document application read its status from whichever follow-up sat first, the status appeared to change on its own afterwards. The status is now taken from the newest follow-up by capture date, so a display change can no longer move business data. Also in this drop: two pairs of fields in the Member form shared the same position, leaving their order arbitrary; all 51 fields now have a fixed position. On staging for the Dhwani testers, verified on a phone against staging across all eleven forms, and the follow-up order confirmed identical before and after a sync.
Open →
July 2026
31
Jul
Web portal — programme staff can work in a browser, and pull their own data out milestone
A browser-based portal for programme staff is live on staging at `/portal`, alongside the app — surveyors are not asked to change anything. Members and all four programme forms get filterable, sortable list screens with a column layout that is saved per person, plus a Follow-ups screen the phone does not offer at all. Managers see every geography; surveyors see exactly what they see on their phone, enforced on the server rather than merely hidden. **Two ways to get data out, answering different questions.** Download on a list exports the one form you are looking at, honouring the filters on screen. The new **Data export** page assembles a dataset: pick any combination of the eleven forms, filter by geography, partner, surveyor, scheme status and a created-on window, and Swasti prepares one ZIP with a CSV per form and no row limit. Every filter defaults to All, and the page states what it is about to pull, with a live count, before it runs. Past ~5,000 records a list stops offering to build the file in the browser and sends you to Data export with that form preselected — previously it quietly produced all eleven forms instead of the one on screen, which is what prompted this. **Exports are readable:** village, donor, partner, scheme and surveyor come out as names rather than internal codes, multi-select answers are joined into one cell, Created and Modified now open correctly in Excel instead of showing an elapsed time like `08:49.0`, and no staff email addresses appear anywhere. **Scheme status is grouped from 21 overlapping options to 9** — nothing stored changes, so the phone is unaffected, and exports carry both the raw status and the grouped one. Worth knowing: the date filter uses **Created**, because Modified reflects the last time anything touched a row including our own data migrations, which is why March records can show a July Modified date. Verified end to end on staging as both a manager and a surveyor.
Open →
30
Jul
Offline follow-ups that arrived out of order are no longer refused fix
Records authored offline are pushed as independent requests, so a later follow-up can reach the server before an earlier one. Three guards read “what is already on the server” as “what happened before this row”, and refused legitimate work when that happened. It had already cost a real record on staging: a Livelihood application took two repayments in the same second and a third valid instalment was rejected as an overpayment (SWF-2026-69326). Scheme, Document and Health follow-up guards are now ordered by the visit number the device assigns rather than by arrival time. The Livelihood repayment closure guard is removed instead — that form has no device-assigned sequence to order by, and the guard only ever defended against something the app already prevents; the loan total is enforced instead, so overpayment is still impossible. Also in this batch: a push the server rejects now keeps its request body, so a failure can be diagnosed rather than guessed at.
29
Jul
Build +42 — Failed records can be fixed on the phone, and sync errors say what to do milestone
Three drops in quick succession, all on staging for the Dhwani testers. **Sync errors are now readable.** The Sync-errors list used to show raw server text — surveyors had no way to tell whether a problem was theirs to fix, would clear itself, or needed support. Every failure is now sorted into one of six kinds (waiting / temporary / connection blocked / needs a fix / system issue / unknown), each with a plain sentence and a clear next step; field names read properly (the question is named, not its internal code); records that are only waiting on a parent no longer look like failures; and the original technical text stays available under 'Technical details' for tickets. Measured against all 755 real production sync-error records from 24–29 July: 66% were unreadable before, none are now (SWF-2026-69164). **A rejected record can now be corrected on the phone, on every form.** Previously only a Member profile could be reopened — which left the biggest correctable groups stranded, including 14 health follow-ups missing the doctor's diet/medication recommendation and duplicate document applications. Scheme, Document, Health Screening and Livelihood applications now all offer 'Fix & resync', and a rejected follow-up in the history list turns amber, reads 'Not synced — tap to fix', and reopens pre-filled; re-saving updates the same record rather than creating a duplicate. **Required fields are now genuinely enforced**, including fields further down a form that were never scrolled to — the cause of members syncing through with a blank Village — and a failed save now names the missing field instead of doing nothing. **A black screen that forced a restart is fixed**: tapping Keep or Dismiss on a failed sync record removed the whole screen instead of closing the confirmation, leaving nothing on screen (SWF-2026-69163, Blocker). Also in this run: members can be searched by mobile number, evidence can be attached as a PDF or file rather than only a photo, a duplicate health screening is blocked with a clear message, and a token blip no longer signs a surveyor out mid data-entry.
Open →
23
Jul
Build +36 — First-sync reliability + honest sync progress (prod load-test drop) milestone
A reliability batch focused on the first sync, shipped to the Dhwani testers as a production-connected build for load testing. Heavy surveyors' first sync no longer stops short of their full caseload — the app now pages through data in a way that resumes where it left off instead of restarting from the beginning, verified pulling a full ~28,000-member account to completion with no loss. The sync screen now shows live progress per section with a running record count and holds there until the essentials are in, so a heavy user no longer lands on an empty 'Members 0 / add your first member' Home while data is still loading in the background. Opening a Home tile (Schemes / Documents / Health / Livelihood) now loads the member list instantly instead of a blank or hanging screen. Also fixed: switching users no longer briefly shows the previous surveyor's name and counts on Home, and a permissions hiccup that could quietly freeze member/geography sync until re-login is resolved. Verified on-device against production on both a ~28,000-member account and a lighter one.
Open →
03
Jul
Build +27 — Livelihood repayment follow-up fixes milestone
Cleaning up the monthly repayment flow from the latest tester pass. 'Is loan fully repaid?' is now a system-decided, locked field — it reads No while any balance remains and Yes once the loan clears, and the worker can no longer set it by hand, so it can't contradict the running balance (SWF-484). The repayment date now saves the moment it's picked, with no dependence on the status field — a fix that landed in the shared date component, so every date field in the app benefits (SWF-484). In the application detail, each monthly repayment keeps its own '1st / 2nd / … Month Payment' chip instead of only the latest card showing one, with the month number tied to the payment's real position in the sequence (SWF-486). The progress chips now read 'Repaid X/11' rather than 'Repaying', and the Closed chip lights up once the loan is fully repaid (SWF-489). Mandatory red asterisks were also added to Q2.5/2.6/2.9 on the Livelihood Application (SWF-477). Verified on-device, including a review-caught ordering bug in the per-card chips that was fixed before release.
Open →
03
Jul
Build +26 — Livelihood Application polish milestone
A follow-up drop tidying the Livelihood flow from the latest tester pass. When a member already rears more than five goats, the form now shows a single clear rejection banner carrying the actual count, instead of that plus a duplicate warning (SWF-473). Every Livelihood card shows 'Applied on <date>' as a fixed line, and closed applications show their closure reason — including 'FPO enrolment under process', which previously fell back to just the date (SWF-474/475); the form also gained a read-only Date of Application row, matching how Scheme and Document surface it. In the application detail, the FPO service and goat-training answers now display their real values instead of dashes (the goat-training values live in a linked table and weren't being read back), the 'Complete Goat Purchase first' helper is now clearly legible, and every due date shows the year with the button reading 'Goat Purchase FU due <date>' (SWF-476). Verified on-device; a data-read defect in the goat-training display was caught and fixed during that verification.
Open →
03
Jul
Build +25 — Livelihood form gating, draft resume, and the sync outage closed out milestone
The Livelihood Application now walks the surveyor through its eligibility questions stage by stage (SWF-464): only the SHG question shows on open, the SHG details unlock on Yes, the FPCL fallback question appears only when it applies, and the rest of the form opens once shareholding is confirmed — with mandatory markers and validation matched to what's actually visible. Tapping a Draft on a member's Scheme or Livelihood tab now reopens the form to continue filling, instead of the read-only summary (SWF-469). The Drafts screen gained a Member filter tab, and member drafts now show their last-edited date (SWF-466). Fields no longer hide behind the Save/Submit bar on tall follow-up forms (SWF-463). Separately, the afternoon's sync outage (SWF-465 — 403s on upload and silently empty downloads, caused by geography-scoping hooks that reached staging ahead of their user provisioning) was root-caused, gated behind a per-site flag, and verified restored end-to-end with the tester account. One open question for the client: the ticket asks the FPCL park window to be 30 days, but the earlier client ruling (SWF-230) set 10 — awaiting a decision.
Open →
02
Jul
Build +24 — Document closure matches Scheme; mandatory markers audited app-wide milestone
Third drop of the day. The Document flow's closed state now mirrors the Scheme baseline (SWF-416/426): the loud 'Workflow Closed!!' banner is gone, closed applications show the same quiet 'Workflow closed' state as Scheme, every follow-up card carries the document name as a subtitle, and the Twice-Approved-No closure label is properly title-cased ('Application Approved & Documents Not Received' — old rows still close via a legacy synonym). All seven follow-up statuses were audited for banner/button/subtitle/case consistency. SWF-372's app-wide audit checked every mandatory question across all 11 forms against its red-asterisk marker: two display gaps fixed (Health 9.2 referral place, Health follow-up 2.6), and a real trap closed — Livelihood 2.1/2.2/2.13–2.15 showed asterisks but only the server enforced them, so offline submits failed at sync time; the form now blocks locally like everywhere else. One dev-found issue logged for the next cycle: the follow-up form's sticky footer can overlap fields on tall Visit-2 forms (SWF-463). With this drop every tester-logged engineering item in the tracker is Done — the four remaining Health items have been awaiting tester re-test since build +12.
Open →
02
Jul
Build +23 — every ticket logged against +21 is now closed milestone
A same-day second drop clears the eight tickets filed on 1 July against the Scheme, Document and Health forms. The Scheme Application's acknowledgement section (ack number, submission date, evidence, follow-up cadence) now appears only when all three verification steps are ticked, in the right order, and the form refuses submission until the submission date and cadence are filled — enforced on the device and on the server. The submission-date value is captured reliably and flows into the follow-up's read-only details. The Scheme Follow-up's Visit Details card is trimmed to just the visit number. Both application forms mark the verification checkboxes as mandatory (red asterisk) and show the member's existing documents as green chips. The Health Screening member card is restructured to match Scheme — geography on top, a collapsible Beneficiary Details section below — with donor and partner shown by name. And every date shown from a record now renders as DD/MM/YYYY instead of raw 2026-07-01-style values. Verified end-to-end on the emulator, including a synced record carrying the new fields. With this drop, all 33 + 8 tickets from the 1-July feedback wave are marked Done in the tracker.
Open →
02
Jul
Build +22 — the 1-July client rulings, all six shipped milestone
Every open question from the feedback batch came back answered and is now live on staging for the Dhwani testers. Scheme eligibility is simplified to State + Age + Annual Income only — caste, gender, marital status and occupation no longer block a scheme application (SWF-394). The Document follow-up now closes the workflow after two consecutive 'didn't check with the department' visits, exactly like the Scheme follow-up (SWF-414). Filling a Livelihood follow-up before its due date now takes an explicit override with a typed reason, which is stored with the record (SWF-375). When the repayments fully cover the loan, 'Is loan fully repaid?' stays on screen — pre-answered Yes and locked — instead of disappearing (SWF-376). A member's Livelihood applications are numbered 1/2/3 in their own history rather than showing system codes (SWF-379). And the Drafts screen got its full overhaul: richer cards (family details, geography, exact form name), search across name/father/spouse/phone/village, module tabs, and an advanced filter sheet with geography cascade, date range and sorting (SWF-366). Submitted Document Applications also gained a read-only detail view matching Scheme and Health. Verified end-to-end on the emulator before release.
Open →
01
Jul
Document flow audited to BRD v2.0 + two rapid feedback batches (builds +18 → +21) milestone
The Document Application form was audited line-by-line against BRD v2.0 and brought into conformance: the sequential Filled → Submitted → Verified gate, verification hidden when the member isn't interested (with a proper 'Not Interested' closed state), the supporting-documents list rebuilt as a read-only display auto-filled from the Document Master (the editable field was removed per SWF-367), submission-date gating, acknowledgement/status details on the application cards, and follow-up cards showing due dates with a Delayed banner. Member Profiling gained drafts and the 'no civic IDs → start a Document Application' prompt. A cross-cutting batch followed: home tiles filtered per program, Save Draft available in every form's bottom bar, drafts showing dates and member names (never raw codes), livelihood follow-up date gates with visible due dates, and corrected repayment status options. A sync fix also unblocked document applications that were failing to push. Roughly 25 KB tickets were addressed across the four builds.
Open →
June 2026
25
Jun
Tester-feedback fixes: Health form cleanup + clearer required-field validation feature
Acting on the latest Dhwani tester feedback (SWF-280/283/284/285): the Health Screening form is tidied — Weight and Height are now separate questions (no longer one merged line), Blood Pressure shows clear Systolic/Diastolic labels, the duplicate Marital Status / Disability questions are removed (they already appear in the member card), and the member card now leads with the member's location. Bigger picture: when a worker taps Submit with required fields still empty, instead of a small 'Missing: …' note they now get a clear count of what's left plus each empty field highlighted in red with exactly what to enter — applied across every form. Shipped to the Dhwani testers on staging.
25
Jun
Drafts extended to Scheme + Document forms; Home Drafts count live feature
The save-as-draft capability shipped for Health now covers Scheme Application and Document Application + Document Follow-up too — a surveyor can save any of these partially and resume later, and the draft stays on the device until Submit (no half-records on the server). Scheme's existing draft was also moved to this device-local model, which fixes a latent sync conflict it shared with Health. The Home dashboard 'Drafts' tile now shows a live count of the surveyor's saved drafts across every form (previously always 0). Shipped to the Dhwani tester group on staging.
25
Jun
Health Screening drafts (BRD §5.1) — save partial, resume later feature
Surveyors can now Save a Draft of a Health Screening, Follow-up or Re-screening — fill part of a form and come back to finish it later, instead of being forced to complete it in one sitting. Drafts stay on the device until the surveyor Submits (they are not pushed to the server as half-records), which keeps the server clean and avoids sync conflicts; a draft shows as 'Draft' on the member's Health tab and reopens exactly where it was left. Shipped to the Dhwani tester group on staging. (Backend adds a workflow_status field that skips mandatory checks while a record is a Draft; the surveyor role gained edit-own permission so a draft can be completed and submitted.)
23
Jun
Staging build — 31 KB issues across Health, Scheme & Livelihood + full Health workflow milestone
A large feedback-triage build went to the Dhwani tester group on staging. Health Screening was reconciled to the clinical BRD (BMI/Hb/BP/RBS logic + British-spelling interpretations, one screening per member, binary combined status, mandatory-field validation, 'None of the above' multi-selects) and the entire follow-up chain was completed — Follow-up 1 (referral visit, reasons as multi-selects, per-marker doctor's readings), Follow-up 2 (medication adherence + side-effects), Follow-up 3 (diet/exercise compliance) and Re-screening final status — using the §13/§14 workflow status codes. Scheme Application got label fixes + document-verification gating; Scheme Follow-up gained the prefilled header / scheme-detail / last-updated-status sections, a Delayed due-date, a rejection-reason multi-select and a richer follow-up list. Livelihood: 'willing to join FPCL' now closes the form (No immediately; Yes → 'FPO enrollment under process' with a 10-day enrollment window) and goat insurance is carried read-only into every monthly follow-up. Plus an evidence-image preview after upload, the Member 'Show all fields' view, and translations seeded for all six languages (AI drafts, native review pending). 31 KB tickets addressed — Health verified on-device, Scheme / Livelihood / Member now with the testers.
Open →
17
Jun
Multi-language (i18n) live on UAT for client testing feature
The app now renders in six regional languages — Telugu, Kannada, Tamil, Malayalam, Marathi, Hindi — switchable in Settings → Language (applies immediately). Backed by ~8.3k translation rows seeded into Frappe on UAT (migrate patches _023/_024) with the language records enabled; verified end-to-end on the UAT build against live UAT, then distributed to the client + internal Firebase groups.
05
Jun
Livelihood — fpo_service_availed gated client-side + Repayment FU cascade-clear fix
PM (Sarthak) hit a sync failure: Livelihood Application pushed with availed_fpo_services=Yes but fpo_service_availed='', server's _validate_conditional_mandatory rejected on push, the dependent Goat Purchase FU then blocked upstream. Two fixes: (1) SWF-181 — client _submit now mirrors the server gate so the row can't reach outbox without 2.7a filled; (2) SWF-180 — same shape on Repayment FU: cascade-clear loan_fully_repaid + avg_net_income when repayment_status flips to Defaulted, and deriveRepaymentStatus ignores cached loanFullyRepaid value when off the Regular/Irregular branch. Both shipped together.
Open →
05
Jun
Bottom-sheet picker no longer jumps form back to previous field fix
Tester report: typing in a numeric/text field then tapping the next Select / MultiSelect, picking an option, watching the form scroll back to the previous field — keyboard reappearing on the still-focused TextField was triggering an auto-scroll. SWF-176: drop focus before opening the sheet (FocusManager.instance.primaryFocus?.unfocus() in both SwastiSelectField and SwastiMultiSelectField). Keyboard dismisses, sheet appears, pick commits, form stays put.
Open →
05
Jun
Livelihood — cascade-clear hidden child answers on parent change feature
Tester (Ritesh) flagged that flipping a parent answer on the Livelihood Application from Yes to No hid the dependent questions but their cached values still drove the derived workflow_status and got saved on submission. SWF-172: cascade-clear walks the visibility hierarchy on every parent-field change and resets every hidden child controller; _derivedWorkflowStatus rewritten to walk SHG → FPCL/willing → goat → revolving top-down so terminal-No parent answers always win.
Open →
05
Jun
Member form — dropdowns rebuilt as bottom sheets + consent / geography numbering feature
All Select, MultiSelect and Link-backed pickers now open as a Swasti-styled bottom sheet (was an anchored DropdownButtonFormField clipping behind the nav bar on bottom-of-form fields). Search bar inside the sheet only shows for >5 options. Long selected labels wrap in the closed field. Consent Form is now Q1 in the numbering. The 5 geography fields render as a contiguous 2/3/4/5/6 block matching the cascade widget. SWF-159 + SWF-163.
Open →
05
Jun
Livelihood Application + Repayment FU polish feature
SWF-162: Livelihood Application now auto-fills Gender / Marital Status / Disabled from the Member profile in the Beneficiary Details section. Repayment FU header trimmed to Name / Age / Phone (Gender / DOB / Marital / Disabled imports dropped — parent application screen already carries the full set). Amount Received on Repayment FU enforces a 1–10,000 ₹ range.
Open →
05
Jun
Member form fixes + opportunistic auto-sync + unsynced indicator feature
SWF-148: disability cert chain is now mandatory server-side when Q36=Yes (field shows the red mandatory dot when visible). SWF-150: looping Other IDs section hidden on both app + Desk pending a PM concept note. SWF-151: duplicate Member (same Name + Father/Spouse + DOB + Phone) hard-blocked at Save with a clear error. SWF-157: records auto-sync to the server in the background after every save (offline-first still primary). SWF-158: small ochre cloud-off icon on listing cards for rows that haven't yet reached the server; clears on its own after auto-sync.
Open →
05
Jun
Livelihood Repayment FU — sequence gate + Defaulted non-terminal feature
Two tester bugs closed end-to-end in one day. The Repayment FU CTA is now locked until a Goat Purchase FU has been filed (SWF-139). 'Defaulted, payment delayed' no longer closes the workflow — it derives 'Nth Month Payment Delayed' and the workflow closes only when loan_fully_repaid = Yes or visit 10 is filed without repayment (SWF-140). Frappe hotfix made loan_fully_repaid conditionally required to match the skip-logic.
Open →
04
Jun
Home count + Follow-up stale-status + quick-add removal feature
Home 'Health Screenings' tile was stuck at 0 — was counting the dead V2 doctype name instead of V3 (SWF-132). Health Follow-up rows were stuck on 'Pending sync' after syncing — current_status is now pre-computed in Dart on save instead of waiting for a server round-trip (SWF-133). Quick-add FAB removed from home (SWF-134). Long-standing sync issue SWF-38 closed.
Open →
04
Jun
Livelihood Repayment workflow + skip-logic + option rename feature
Loan-fully-repaid = Yes now closes the parent application (SWF-126). Avg Net Income and Loan Repaid hide for 'Defaulted, payment delayed' months and reorder (SWF-127). Option renamed 'Defaulted, No payment made' → 'Defaulted, payment delayed' with a data-migration patch (SWF-128).
Open →
03
Jun
Health Screening — PM Excel tracker fully drained (Batches A–E) milestone
Five batches closed seven HS tickets — numeric range hints in section headers, member-imported fields rendered read-only, live BMI / BP previews, follow-up census header + Visit 2 side-effects hoist, Expressed Illness multi-select, section numbering on follow-up + re-screening, orphan Others fields dropped. SWF-108 / 118 / 119 / 120 / 122 / 123 / 124.
Open →
02
Jun
Engineering code review closed end-to-end — eight of nine items addressed on staging milestone
The Flutter app code review from the Android team (delivered 1 June) is now fully worked through. Eight of nine review items landed as code on the staging branch as a single merge commit — the sync bootstrap now drives the SDK's pull pipeline directly (surveyors only re-fetch what's changed on subsequent logins, not every doctype from scratch), doctype-name string literals across the app are centralised into one constants file (typo-safety and easier find-usages), the member-add screen lost about 280 lines of widget code into a dedicated pickers file, and screen/provider raw SQL calls that the SDK's resolver can express now go through it. Three smaller items closed as design-intent header comments (the static layout schema and the link-resolver wrapper are intentional choices, now documented as such). The ninth item — a concern that the app bypasses the SDK's form-builder — re-investigation showed the abstraction was tried earlier (May), shipped, and intentionally removed as premature; all five form screens already share the same form-context shell and design-system primitives. Two upstream pull requests are queued on the SDK repository (#68 wires a developer-build hook for the connectivity probe; #69 promotes the depends-on expression evaluator to the public API surface). The next tester build picks all of this up.
Open →
01
Jun
Feedback submissions are now editable from the KB feature
The KB feedback list now has an Edit option on every card. Anyone with the KB login can correct a submission's title, description, form/screen, severity and submitter name, change its status (Open / In Progress / Done / Won't Fix), and add or remove screenshots — without opening the Frappe desk. Saves go straight to the engineering Frappe.
Open →
May 2026
31
May
Flutter app handed to Android team for code review milestone
The staging branch (with the four tester-facing fixes and the architectural changes from the audit cleanup) is out with the Android team for a code-quality review pass alongside the live build. About a dozen commits over the original Build 3.3 baseline. No deadline pressure — landing dependent on review feedback.
31
May
Build 3.4 released — four tester-facing bugs from this week fixed milestone
A fresh staging build with the bug fixes the team raised through the week. Four issues are gone: (1) the Apply Scheme picker was showing "No schemes match" for every member because the local query was looking at an old column name — schemes now show correctly and the 7-dimension eligibility filter is back; (2) Apply Document's Pick Document was failing with a database error — picker now loads the curated set; (3) tapping an applied Scheme or Document card on the member detail screen did nothing — both are now clickable and open the detail screen so a follow-up can be added; (4) Member save would sometimes succeed locally with required fields empty inside the collapsed Additional Details section and then fail on the server — save now blocks until every required field is filled and tells the surveyor what's missing. Sync also auto-retries when the network drops mid-push, and older app data self-heals on the next sync (no need to clear the app).
29
May
Frappe-controlled required fields land on the app feature
Up to now, which fields were required in each form was baked into the app at build time — flipping a field's required flag on the Frappe side required a new release before surveyors saw it. From this build, the app reads the live field configuration on each sync. PMs can now mark a field required (or conditionally required, e.g. "Type of Disability is required only when Disabled = Yes") on Frappe and surveyors see it on their next sync, no app rebuild needed. Covers all eleven Member / Scheme / Document / Health / Livelihood forms.
29
May
Member save bug fixed — fields inside Additional Details now blocked properly feature
A surveyor could press Save on a member with required fields left empty inside the collapsed "Additional Details" section — the save succeeded locally but the server rejected on push with a mandatory-fields error. The collapsible was hiding its fields from the form's validation. Fixed: Save now blocks until every required field is filled and tells the surveyor what's missing, regardless of which section the empty field is in.
29
May
New staging build with the fixes — testers can sign in directly milestone
A fresh staging build is out on Firebase. Two long-latent setup issues were also corrected: the test surveyor login (Lakshmi Devi) is now pre-filled on the sign-in screen for staging builds, and the app now reaches the correct staging server (the prior URL had been an unreachable placeholder since 20 May, so any attempt to sync against staging on prior tester builds would have silently failed). PMs who install this build can sign in and pull masters immediately.
29
May
Engineer-facing code review cleanup — sync hardening + dead code purge infra
Background work that doesn't change what surveyors see but tightens what's under the hood. Sync now auto-retries when the network drops mid-push (TimeoutException, dropped sockets, connection refused — previously these left rows stuck as Failed until manual re-sync). Five hundred lines of dead and dormant code removed (an old outbox drainer replaced by the SDK months ago; two unused form widgets; a duplicate Material button in the Member form). Test suite grew from 425 to 456 passing tests, including new smoke tests for the six previously-untested Add/Followup screens (Livelihood + Health) and full pinning of the new meta-driven validation logic.
28
May
Livelihood backend + Flutter UI built and on-device verified milestone
Frappe backend (5 DocTypes — Application, Goat Purchase Follow-up, Repayment Follow-up + option masters — plus status module and _017 manifest patch) committed and verified on local bench. Flutter UI mirrors the Scheme Application pattern: application form, two follow-up types, and a detail screen with 6 collapsible sections, stage chips, and a due-date hint anchored on fund_receipt_date + 30 days. All 9 PM open questions (A–I) answered by Shweta 2026-05-27. On-device verified on emulator-5554 (dev build): home count, listing card, detail header, Beneficiary resolves to member. The child-table sync gap that initially blocked save + push (#186) was resolved app-side via a hand-built docs__&lt;child&gt; v2 schema migration plus a matcher rewrite to parent_uuid.
Open →
27
May
First tester build released (Firebase App Distribution) milestone
The first staging build went out to the Dhwani tester group via Firebase, covering the full surveyor journey — Member, Scheme Application + Follow-up, Document Application + Follow-up, and Health Screening + Follow-ups + Re-screening. Release notes spell out exactly what to test. A first-day dropdown issue on the two newest forms was traced to a missing database column that had aborted the server migration before the mobile manifest was updated; once the migration completed cleanly, every form's options populate after a sync.
27
May
Health Screening rebuilt greenfield to the PM walkthrough feature
The largest piece of this release. Health Screening is now a single long-scroll form with live status pills for BMI, Haemoglobin, Blood Pressure and Blood Sugar that derive as the surveyor types, each with plain-language interpretation text. It splits into three records — the screening, up to three follow-up visits (each visit asks its own questions: Visit 1 is the government-hospital visit and doctor's readings; Visits 2 and 3 cover medication adherence and diet/exercise), and a re-screening flow. Weight, height and Haemoglobin accept decimals; the disability answer is inherited from the member's profile rather than re-asked; the Healthy Days and Illness sections use the full V2 question wording. Visit history shows as tappable cards that expand to every captured field.
27
May
Scheme & Document follow-ups, with offline-first against unsynced parents feature
Scheme Application and Document Application both gained multi-visit follow-ups. Status auto-derives from the application's progress, and marking a visit Delayed pushes the next due date out 30 days. A surveyor can now record a follow-up against a parent application that hasn't synced yet — the outbox resolves the link to the real server record at push time, so nothing blocks on connectivity. Document Application's apply-list is the PM-curated 17-document set.
27
May
Login persists across app restarts feature
Surveyors are no longer asked to log in again every time the app is cold-started — the session is restored automatically. Two field-reported issues were also fixed: dropdowns rendering with a black background on some phones, and the back button on the sync screen logging the user out.
21
May
Scheme Application rebuilt to V2 PM spec end-to-end feature
Apply Scheme now matches the PM video walkthrough exactly. One long scroll, three collapsible sections (Beneficiary Details, Scheme Application, Document Verification), top read-only display block, and an About-this-scheme card that auto-fills description, clickable link, the member's existing documents, the scheme's required documents, and Civic ID status. The card highlights any documents the scheme requires that the member doesn't have. The single status pill is replaced with three progression chips — Filled, Submitted, Verified. Donor/surveyor inheritance bugs and the geography mandatory-field error are fixed.
21
May
Manual sync button on Home (Tap to sync) feature
Every form save is now strictly offline-first: writes are persisted to local SQLite + queued in an outbox, the surveyor sees success immediately. The new Home sync pill drains the outbox to the server on demand, surfacing per-record success/failure. No save ever blocks on network — a phone with no signal continues to work for the full surveyor session.
21
May
16-state scheme master refresh (was 7 states) data
PM-supplied refreshed Scheme Master CSV imported — 186 schemes now cover Andhra Pradesh, Bihar, Delhi, Gujarat, Haryana, Karnataka, Kerala, Madhya Pradesh, Maharashtra, Meghalaya, Mizoram, Nagaland, Rajasthan, Tamil Nadu, Tripura, and Uttar Pradesh. Haryana alone now lists 112 eligible schemes (was 0). The seeder is now header-based so future PM refreshes don't need code changes.
20
May
Offline scheme eligibility wired end-to-end on device feature
Scheme Master and its 6 child eligibility tables (state, gender, caste, marital, occupation, required documents) now materialise on the surveyor's phone during sync — 185 schemes, 709 state rows, 6,260 occupation rows, 477 required documents. The Scheme Application screen filters the picker to only show schemes the member is eligible for, computed locally from the synced tables (no network round-trip).
20
May
Document Master unified + Civic Document Type retired; deployment KB published docs
Single canonical Document Master with 183 Title-Case rows now used by Member Profiling, Scheme Application and Document Application. Civic Document Type doctype dropped — Member.b_prof_doc rewired to the new Member Document Item child Linking into Document Master. Scheme Master child tables wired for multi-value eligibility (709 state child rows, 477 required-document child rows across 185 schemes). New KB note 14 captures the two GitHub repos, the staging→uat→main branch policy, the four env applicationIds, build scripts, and release path (Firebase for staging, Play Store via DevOps for uat/prod).
Open →
20
May
Scheme eligibility logic locked + donor master imported docs
Donor master from V2 prod imported into Frappe — 2,105 donor records tagged to GP, 17 partners. Scheme master CSV (186 schemes, one-hot encoded across state/gender/caste/marital/occupation + age and income regexes) analysed. Matching algorithm, document canonicalisation strategy (Member-form Title Case), schema gap analysis, and 5-step implementation plan locked as note 13. Two PM confirmations pending.
Open →
20
May
Health Screening walkthrough captured + spec written docs
PM Fahim's ~18-min V2 walkthrough (Video 2.mp4) fully analysed. Canonical spec written as note 12 — covers full initial screening → 3 follow-ups → rescreen lifecycle, all BMI/Hb/BP/RBS thresholds from HS_Logics sheet, eligibility bands by age and gender, and follow-up status labels. 8 doctype gaps and 10 PM open items documented.
Open →
19
May
Member form polished after first device walkthrough feature
All radios converted to dropdowns. Address is now a proper textarea. Conditional fields (e.g. 'Please specify if Other') now correctly hide unless their parent is selected. File-upload placeholders and the 'store more IDs' block removed since they're not in the PM video. Dropdown field labels float above the selected value so the question stays visible after picking an option. Caste tap bug fixed.
Open →
19
May
Member form rebuilt against PM video milestone
Replaced the previous 7-page wizard with a single continuous scroll matching V2's exact display order. Consent now opens at the top with a popup (red outline until agreed, green check after). Donor and Partner names auto-fill when Grampanchayat is picked. Individual Facilitator has a Get button that fills in the surveyor's name. Number of household members field added. After Save, the Civic ID answer routes to either Document Application (if 'No') or Scheme Application (if 'Yes'). 97 tests passing across the rebuild.
Open →
19
May
PM video analysis published docs
Fahim's V2 walkthrough recorded and indexed. See note 11 — Member form authoritative flow. PM video declared source of truth for fields, order, and logic going forward.
Open →
19
May
Form audit pipeline hardened infra
Validation regeneration now enforces numeric bounds for age-style fields and pulls bounds from the V2 source automatically (no more silent breakages on re-run).
19
May
Conditional disability fields wired on both ends feature
"Type of disability" only shows when "Disabled?" = Yes. "Specify other" only shows when type = Other. Server and mobile both enforce the rule.
19
May
Date format standardised to DD/MM/YYYY feature
Picker header, text-input mode, and field display all use DD/MM/YYYY across the app. Age auto-calculates from DOB.
19
May
Member save → sync proven end-to-end milestone
Surveyor can record a Member offline (no network), the entry queues in the local outbox, and pushes to the server on next sync. Two test members successfully created on the backend.
18
May
Consent drift sealed feature
Consent moved to its proper place as a form-level gate (not per-field condition). Server validation enforces it before save. Mobile mirrors the rule.
18
May
Server-side validation rules ported to mobile infra
351 validation tests green. Mobile form now catches the same errors the server would, so surveyors don't lose work to sync-time rejections.
16
May
Offline-first pull-sync wired infra
After login, the app pulls all referenced data (members, schemes, documents) into local cache so the surveyor has read-access offline.
15
May
Phase 6 — Scheme Application ADD screen feature
Built on the shared form primitives. Acts as the template pattern for other forms.
06
May
Livelihood workflow design captured docs
PM (Fahimuddin) shared Miro board. SHG/FPCL qualification → goat-purchase check → 9 monthly repayments → final closure. See note 10.
Open →

Coming up

Sequenced work; the top item is what's queued next.

1 Web portal to production — awaiting PM sign-off on the export changes
The portal and data export are live on staging and verified; production has no portal at all yet, so this is a first-time rollout rather than an update. The PM asked to confirm the export rework before it is pushed. The deploy itself writes no beneficiary data — the pending patches only touch permissions, no doctype changes the large tables, and the option masters are already identical to production — but it does create the `Swasti Manager` role, which carries edit and bulk-import rights as well as read, so manager accounts should be created as named individuals rather than a shared login.
ETA: On PM sign-off, then a DevOps deploy window.
2 Outgoing email is not configured on staging or production
Neither environment has ever sent an email. A prepared export is therefore delivered as a private in-app download link, which works today and expires after 48 hours; the email carries the same link and starts arriving once DevOps provisions the account, with no further change needed. Related: 547 of the 549 production users are real surveyor logins at `<mobile>@swasti.local` addresses, which can never resolve — they are not dummy accounts and cannot be deleted, so notification email for them is switched off by the deploy. That has to be migrated before outgoing email is enabled, or the first send attempt bounces for all of them.
ETA: With DevOps.
3 Export not yet measured at production scale
Staging holds about 8,150 members against production's 557,873 — roughly 1.5% of one module — and a full staging export is ~1.4 MB in a few seconds. The production duration and file size are extrapolations until a real run is measured, and the ~5,000-record threshold at which a list stops building the file in the browser is an estimate rather than a measured limit. Worth doing once against production before the client is pointed at it.
ETA: After the production deploy.
4 SWF-2026-69165 — 'responses do not auto-sync' needs a correction before it is built
Filed after a run of failed saves. Auto-sync already exists and has since May: every successful submit fires a background upload of everything pending, on all modules, with no need to tap Sync now. What was actually happening is that those submissions were being rejected by the server and the failure was silent, which looks identical to auto-sync not running. Two real defects did come out of it and are worth keeping: the background upload fails silently, and there is no automatic retry when the phone comes back into coverage — so a surveyor who collects offline and then stops working still has to tap Sync now. Needs the PM's agreement to re-scope around those two rather than rebuilding what is already there.
ETA: On PM confirmation.
5 Failed-records list can show stale 'All records are in sync'
Found while verifying the Keep/Dismiss fix. The Sync tab reads its failed-records list from a cache that is populated when the app starts and only refreshed after a sync or a pull-to-refresh — so a record that fails while the surveyor is on another screen may not appear until they pull down. Minor, but it undermines confidence in the screen we just made readable.
ETA: Next drop.
6 Livelihood follow-ups still cannot be corrected on the phone
The Fix & resync recovery route now covers Member, Scheme, Document, Health Screening and the Livelihood application itself, but not the goat-purchase and repayment follow-ups — those have no edit route at all and are not draft-capable, so a rejected one is still stranded. Needs new routes plus edit support in those two forms.
ETA: Next sprint.
7 Sync-error messages are not translated yet
The new plain-language sync messages ship in English only — 22 strings plus 8 status labels have no Translation records yet, so a Hindi-first surveyor reads them in English while the rest of the Sync screen is translated. Needs the six-language pass before this promotes beyond staging.
ETA: Before UAT/prod promotion.
8 Native-speaker review of the new translations
The Health / Scheme / Livelihood strings added this release were AI-drafted across all six languages and seeded; they need a native-speaker pass before this build promotes to UAT/prod.
ETA: Before UAT/prod promotion.
9 Dhwani tester verification of the 23-June build
Health is engineer-verified on-device; Scheme Application, Scheme Follow-up and Livelihood are newly built and need tester exercise on staging before we mark those KB tickets Done.
ETA: This week.
10 SWF-230 — confirm the FPCL 10-day window with the spec owner
Built per the client ticket (10-day window + 'FPO enrollment under process' status), diverging from spec v1.1's 30-day rule; spec bumped to v1.2. Worth a final spec-owner sign-off.
ETA: On confirmation.
11 2 latent `reqd: 1` traps on Repayment FU
amount_received, repayment_date — Desk-vs-server pattern (goat_insurance is now resolved, made read-only/imported). Latent until a skip-logic case drops one.
ETA: Next sprint.
12 Telangana scheme content is missing at the source
The V2 scheme master export contains no Telangana rows at all (16 states are seeded on staging; Telangana isn't one of them), so Telangana members see no eligible schemes. This isn't a filter bug — the client needs to supply Telangana scheme content, or confirm the state is out of scope.
ETA: Client decision.
13 Drafts search — phonetic matching
The new Drafts search matches on normalised spelling (name/father/spouse/phone/village). The ticket also asked for fuzzy/phonetic matching for regional spelling variations — parked for a later cycle.
ETA: Later cycle.

Last updated 2026-08-11