Swasti · mForm V2→V3

12 — Health Screening authoritative flow (PM video)

Authority: PM Fahim’s voiceover walkthrough of mForm V2 production, recorded 2026-05-19 (“Video 2.mp4”, ~18 min, 167 segments). This note is the canonical Health Screening spec going forward. When this contradicts the V2 form JSON (forms 1010 / 1011), the video wins for surveyor-facing UX and field order. When the video doesn’t state a specific threshold, the HS_Logics sheet (raw/pm-design/extracted/HS_Logics.md) wins for numeric values. The V2 JSON fills in option lists only.

Program context

Health Screening is one of the core programs Swasti runs. It sits immediately after Member Profiling in the lifecycle: once a member is profiled, a field worker opens the Health Screening form for that member.

The program has a structured follow-up lifecycle:

Initial Screening (5.1)
    └── if any marker abnormal → Follow-up 1 (5.2, visit 1)  [~15 days later]
            └── if still abnormal → Follow-up 2 (5.2, visit 2)
                    └── optional → Follow-up 3 (5.2, visit 3 or 4)
                            └── Re-screening (5.2, final visit)
                                    └── workflow closes
    └── if all markers normal → workflow closes immediately

“There are technically three follow-ups and the fourth one is the rescreen, so there are total four follow-ups.” — PM Fahim [00:50–00:57]

The V2 system had two separate forms: form 1010 (initial screening) and form 1011 (follow-up). V3 folds both into one Health Screening doctype (health_screening), distinguished by visit_number:

  • visit_number = 1 → initial screening
  • visit_number = 2, 3, 4 → follow-up visits (numbers go up if a follow-up couldn’t be completed in one visit)
  • visit_number = 5 (or final) → re-screening

Entry point and auto-population

The surveyor navigates to the member’s detail page and taps the Health tab. If no screening exists, the tab shows an “Add Health Screening” button. Tapping it opens the 5.1 Health Screening form.

“Once a member is created and profiled we move to the health section here, when we click on the add health screening the health screening form automatically opens.” — Fahim [01:06–01:11]

Auto-population on open:

  • Question 6 (Member Details) uses a dynamic option that pulls name + phone number for the identifier. The surveyor selects the member from this dropdown; selecting it triggers population of the remaining pre-filled fields.
  • Geography (State → District → Block → Grampanchayat → Village) all cascade and auto-fill from the logged-in user’s context / the member record.
  • Demographics (Gender, Date of Birth, Age, Age in months, Marital Status, Disabled, Pregnant) are pre-populated from the Member profile — the surveyor does not re-enter these.
  • Date of Health Screening defaults to today.

“Few of the details are automatically imported which are not to be selected from the user.” — Fahim [01:23–01:29]

Health tab — screening summary card post-submit showing current status and follow-up due date

Form structure (Initial Screening — visit_number = 1)

The initial screening form renders as one vertical scroll. Sections are collapsible but most are expanded by default. Field sequence follows V2 viewSequence order.

Section 1 — Member details (pre-filled, read-only)

All fields in this section are auto-populated from the member profile. The surveyor cannot edit them here.

FieldDoctype fieldnameTypeMandatoryNotes
StatestateLinkYesFrom user context
DistrictdistrictLinkYesCascades from state
BlockblockLinkYesCascades from district
Grampanchayatgram_panchayatLinkYesCascades from block
VillagevillageLinkYesCascades from GP
MembermemberLinkYesQ6 — dynamic option showing name + phone
GendergenderSelectYesPre-filled from member
Date of Birthdate_of_birthDateYesPre-filled from member
AgeageFloatYesPre-filled from member
Age in monthsage_monthsFloatYesUsed for child/adolescent BMI Z-score
Marital Statusmarital_statusSelectYesPre-filled from member
DisableddisabledSelectYesPre-filled from member
PregnantpregnantSelectYesVisible only if Gender = Female
Date of Health Screeningdate_health_screeningDateYesDefaults to today
Blood Groupblood_groupSelectNoSurveyor enters; non-mandatory

Section 2 — BMI Details

“Here we capture the weight, height, and BMI is automatically calculated.” — Fahim [02:19–02:25]

FieldDoctype fieldnameTypeMandatoryNotes
Weight (in kg)weight_kgFloatYesRange 0–160, 2 decimal places
Height (in meters)height_metersFloatYesRange 0.1–2.5, 2 decimal places
Height in cmheight_cmFloatAutoDerived from height_meters × 100
BMI calculatedbmi_calculatedFloatAutoweight_kg / height_meters²
BMI Status — Adultbmi_status_adultSelectAutoSet if age ≥ 18
BMI Status — Childbmi_status_childSelectAutoSet if age 0–5 (weight-for-height Z-score)
BMI Status — Adolescentbmi_status_adolescentSelectAutoSet if age 5–18 (BMI-for-age Z-score, WHO)
SD scores (WFH/WFA)sd_minus2_wfh, sd_plus2_wfh, sd_minus2_wfa, sd_plus2_wfaFloatAutoZ-score reference values for child band
BMI Interpretationin_underweightin_severe_obesityHTMLAutoInline text shown based on status; one active at a time

“Since this is an adolescent kid, the BMI status based on Z-score is calculated as described by the World Health Organization. The member is classified as obese — this automatically comes.” — Fahim [03:45–04:04]

BMI section — weight 35 kg, height 1.3 m, BMI 20.7, BMI Status Adolescent = Obesity

BMI status auto-calculated — section overview showing HB, BP, Diabetes sections below

Section 3 — HB (Haemoglobin) Value

FieldDoctype fieldnameTypeMandatoryNotes
HB Value (in g/dL)hb_valueFloatYesRange 0–20, 1 decimal place
HB Statushb_statusSelectYesAuto-set from threshold table; options: Normal Anaemia / Mild Anaemia / Moderate Anaemia / Severe Anaemia / High Haemoglobin
HB Interpretationin_normal_hbin_high_hemoglobinHTMLAutoInline explanation text

“Now we move to the HB value — here we can give the HB value. The value is 14, which is in the normal range.” — Fahim [04:04–04:15]

Section 4 — BP Value 1 (First reading)

“If this is in abnormal range — for example, the status of the systolic pressure is severe high — which means [the surveyor should] pause the form for 30 minutes and save it as a draft, then reopen it and continue the form.” — Fahim [05:04–05:34]

If BP reading 1 shows an abnormal result, the surveyor is instructed to pause, wait 30 minutes, and re-take the reading before entering BP reading 2.

FieldDoctype fieldnameTypeMandatoryNotes
1st BP — Systolic (SBP)bp1_systolicIntYesRange 0–250
1st BP — Diastolic (DBP)bp1_diastolicIntYesRange 60–110
BP-1 Systolic Stage Statusbp1_systolic_stageSelectYesAuto-calc from systolic stage logic
BP-1 Diastolic Stage Statusbp1_diastolic_stageSelectYesAuto-calc from diastolic stage logic

Section 5 — BP Value 2 (Second reading)

FieldDoctype fieldnameTypeMandatoryNotes
2nd BP — Systolic (SBP)bp2_systolicIntYesRange 0–250
2nd BP — Diastolic (DBP)bp2_diastolicIntYesRange 60–110
BP-2 Systolic Stage Statusbp2_systolic_stageSelectYesAuto-calc
BP-2 Diastolic Stage Statusbp2_diastolic_stageSelectYesAuto-calc
BP Status (final)bp_statusSelectYesCumulative across both readings
BP Interpretationin_low_bpin_severe_high_bpHTMLAutoInline explanation

“The first time it was normal / high normal. Now if the member’s blood pressure has come as normal — it’s normal and high normal — and based on this, this is our second reading.” — Fahim [05:55–06:13]

BP reading 2 — SBP 120, DBP 80, Systolic Stage = Normal, Diastolic Stage = High Normal

Section 6 — Diabetes (Blood Sugar / RBS)

FieldDoctype fieldnameTypeMandatoryNotes
Diabetes Level / RBSdiabetes_level_rbsFloatYesRange 50–550, no decimal places
Diabetes Statusdiabetes_statusSelectYesAuto-set; options: Low (Hypoglycemia) / Normal / PRE-Diabetic / Diabetic
Diabetes Interpretationin_low_bsin_diabeticHTMLAutoInline explanation

“After that we move to the diabetic status. It is coming as diabetic.” — Fahim [07:06–07:14]

Section 7 — Healthy Days Question

FieldDoctype fieldnameTypeMandatoryNotes
Physical health daysphysical_health_daysIntNo”In the past 30 days, how many days did poor physical health keep you from usual activities?”
Mental health daysmental_health_daysIntNoSame question for mental health

These two fields are non-mandatory. The video does not explicitly walk through them; they appear in the section list.

Section 8 — Illness and Referral

FieldDoctype fieldnameTypeMandatoryNotes
Expresses Illnessexpress_illnessTable MultiSelectYesMulti-select from Health Screening Expressed Illness Item child table
Specify if Othersillness_specify_othersSmall TextConditionalRequired if “Others” selected in express_illness
Where to refer this member?referralSelectConditionalRequired if any marker is abnormal (Hb, BP, or diabetes not Normal). Options: PHC / Gov. CHC or THC / Gov Hospital / Private Clinic / Private Hospital / Others
Specify referral if Othersreferral_specify_othersSmall TextConditionalRequired if referral = Others
Did you receive any health education?health_educationSelectYesYes / No

“After that we move to the diabetic status… there are the illnesses if there are any health [issues] we capture based on the values that we get in the field.” — Fahim [06:13–06:28]

Diabetes Status = Diabetic, Referral = Gov. CHC or THC, Health Education = No, Submit button visible

Section 9 — Status

FieldDoctype fieldnameTypeMandatoryNotes
RemarksremarksSmall TextNoSurveyor notes
Final Scorestatus_final_scoreDataAutoInternal roll-up score
Current Statuscurrent_statusSelectYes”Moving to 1st Follow-up” or “Health Status Normal (Workflow closed)“
Follow-up Due Datefollowup_due_dateDateAutoSet to today + 15 days if moving to follow-up
Workflow Statusworkflow_statusSelectAutoDraft / Screened / Referred / …

“This is the final status. Since the health is not normal of this member, we are moving into the first follow-up. Follow-up happens first after 15 days, so due date for the first follow-up has been set.” — Fahim [07:14–07:28]

Eligibility logic by band

The thresholds below come from the HS_Logics sheet — these are the authoritative numeric cutoffs. The app computes statuses automatically; surveyors see only the result label and interpretation text.

BMI thresholds

Adults (age ≥ 18) — BMI in kg/m²

GenderBMI RangeClassification
Male< 18.5Underweight
Male18.6 – 22.9Normal
Male23.0 – 24.9Overweight (At risk)
Male25.0 – 29.9Pre-Obese
Male≥ 30.0Obese
Female< 18.5Underweight
Female18.6 – 22.9Normal
Female23.0 – 24.9Overweight (At risk)
Female25.0 – 29.9Pre-Obese
Female≥ 30.0Obese

Children/Adolescents (age 5–18) — BMI-for-Age Z-Score (WHO SD)

Z-ScoreClassification
< −3 SDSevere Thinness
−3 SD to < −2 SDThinness
−2 SD to +1 SDNormal
> +1 SD to +2 SDOverweight
> +2 SDObese

“BMI for children from 0–5 and 5–10 as well as 10 above and for adults varies a lot. We use a concept of Z-score and therefore calculating those values.” — Fahim [17:29–17:51]

Children (age 0–5) — Weight-for-Height Z-Score

Uses WHO WFH tables; SD scores sd_minus2_wfh and sd_plus2_wfh stored for reference.

Haemoglobin thresholds (g/dL)

GroupNo AnaemiaMild AnaemiaModerate AnaemiaSevere AnaemiaHigh Haemoglobin
Children (0–14 yrs) M/F≥ 11.010.0 – 10.97.0 – 9.9< 7.0> 18.0
Men (≥ 15 yrs)≥ 13.011.0 – 12.98.0 – 10.9< 8.0> 18.0
Women (≥ 15 yrs)≥ 12.011.0 – 11.98.0 – 10.9< 8.0> 18.0
Pregnant (any age)≥ 11.010.0 – 10.97.0 – 9.9< 7.0> 18.0

Blood Pressure thresholds (mmHg) — applies to age ≥ 13, all genders

Final bp_status is the higher of systolic stage and diastolic stage across both readings.

Systolic stage logic

StageSystolic Range
Low≤ 80
Normal90 – 129
High Normal130 – 139
Slightly High140 – 159
Moderate High160 – 179
Severe High≥ 180

Diastolic stage logic

StageDiastolic Range
Low≤ 59
Normal60 – 79
High Normal80 – 89
Slightly High90 – 99
Moderate High100 – 109
Severe High≥ 110

BP Status — combined label (used in bp_status field)

Combined classificationbp_status value
Low (both readings Low)Low
NormalNormal
High NormalHigh Normal
Slightly HighSlightly High
Moderate HighModerate High
Severe HighSevere High

Note: members under age 13 get bp_status = "NA as the member's age is less than 13".

Blood Sugar (RBS, mg/dL) — all age groups

RangeStatus
< 70Low (Hypoglycemia)
70 – 139Normal
140 – 199PRE-Diabetic
≥ 200Diabetic

Final status and workflow

Current Status options (initial screening)

current_status valueMeaning
Health Status Normal (Workflow closed)All markers are Normal — no follow-up needed, case closes
Moving to 1st Follow-upAt least one marker is abnormal — follow-up cycle begins

Closure rule at initial screening

“The cumulative final status — based on which we either move the member to the health screening follow-up stage or the workflow closes here if the member has a normal health status.” — Fahim [02:02–02:19]

If all of the following are true, the workflow closes immediately:

  • HB status = Normal (No Anaemia)
  • BP status = Normal or Low
  • Diabetes status = Normal

If any marker is outside normal range, current_status = "Moving to 1st Follow-up" and followup_due_date = today + 15 days.

Follow-up flow (form 1011, folded into visit_number 2+)

The follow-up form is titled 5.2 Health Screening Follow-up in V2. In V3 it uses the same health_screening doctype with visit_number incrementing.

“Visit number 1, 2, 3… Since the first follow-up didn’t happen in one visit, it happened in two visits, so the visit number is now four.” — Fahim [08:36–14:48]

Follow-up form structure

Field groupFieldsNotes
Auto-populatedGeography (State → Village), Member Details, visit_numberCarry over from initial screening
hsf_followup_dateDateCurrent visit date; defaults to today
Previous follow-up statusfu_current_status of prior visitShown from visit 2 onward; hidden on visit 1
Follow-up 1 section (HS Follow-up 1)fu_counselling_provided, fu_health_edu_nurse, referral-center visit questionsDid member visit referral centre? Did screening happen there? If not, reason for failure
Status of Follow-up 1fu_rescreening_hb_status, fu_rescreening_bp_status, fu_rescreening_diabetes_statusAuto-set if screening happened; otherwise carried from last successful reading
fu_current_statusSelectStatus label for this visit

“Since this is the visit number two, this ‘previous follow-up status’ will not come for visit number one, but it will start coming from visit number two because there’s a precursor.” — Fahim [10:23–10:33]

Follow-up 1 (visit 1) — key questions

  • Did the member visit the referral centre (government hospital / PHC)?
  • If yes: was the screening completed there?
    • If no → reason (e.g., “lab facility not available”)
    • If yes → record HB, BP, RBS values from the referral centre

Follow-up statuses

Status labelMeaning
Member visited the referral centre but screening not completedFU1 visit happened; lab couldn’t do it — eligible for another visit
Member under medication and moving to 2nd follow-upFU1 complete; member on meds; needs FU2
Member under medication and 2nd follow-up completedFU2 done; surveyor can skip to rescreen or proceed to FU3
Moving to 3rd follow-upFU2 complete, 3rd follow-up selected
Member under medication and 3rd follow-up completedFU3 done; moves to rescreen
Member under medication and managingFinal rescreen — all readings now in acceptable range

Follow-up form — Visit Number 1, geography auto-populated, member Aditya - 7017129440

Follow-up 2 and 3 — what’s different

“In the second follow-up we don’t capture any value or reading — we don’t capture it at all.” — Fahim [13:04–13:12]

Follow-up 2 and 3 focus on:

  • Is the member taking medication regularly?
  • Side effects experienced (multi-select)
  • Refer to doctor again?
  • Diet plan provided?
  • Health education session conducted?
  • “Do you want to do a 3rd follow-up?” (Yes/No) — this gates whether FU3 opens

“Also here there’s an option that if you don’t want to do a third follow-up, click on No and the status is ‘member is under medication and second follow-up completed’ — and the member will directly move to rescreening.” — Fahim [13:20–13:46]

Due date for each follow-up = 15 days from the current visit date.

Re-screening (final visit)

Re-screening opens after third follow-up is completed. It re-captures HB, BP (SBP + DBP), and RBS values just like the initial screening, then sets a final status.

“In the re-screening we capture the values like we captured in follow-up 1. We don’t capture the readings in follow-up 2 and 3, but here we calculate again.” — Fahim [15:18–15:30]

FieldDoctype fieldnameNotes
RS HB Valuefu_rescreening_hb_status0–20 g/dL
RS BP (SBP)re-screening SBP field0–250 mmHg
RS BP (DBP)re-screening DBP field0–150 mmHg
RS RBSre-screening RBS field50–550 mg/dL
Re-screening HB StatusautoSet from threshold table
Re-screening BP StatusautoSet from threshold table
Re-screening Diabetes StatusautoSet from threshold table
Final current_statusfu_current_statuse.g. “Member under medication and managing”

After rescreen is submitted, no further follow-up is allowed — the workflow closes permanently.

“Since there’s no further follow-up happening, the workflow closes here once I submit this.” — Fahim [16:23–16:31]

Re-screening section — RS HB Value, RS BP (SBP/DBP), RS RBS inputs, Status of Re-screening fields

Gap analysis vs current doctype

The doctype JSON at frappe-bench-swasti/apps/mform_swasti/mform_swasti/health/doctype/health_screening/health_screening.json is the implementation baseline. Gaps identified below are action items for the build team — the doctype should not be changed without a separate review.

#TypeDescription
1MISSING”Do you want a 3rd follow-up?” gate field — the video shows an explicit Yes/No question in FU2 that determines whether FU3 is created. This is not in the current doctype field list as a standalone field. The fu_current_status captures the outcome but not the surveyor’s explicit choice.
2MISSINGFollow-up 2 and 3 medication/diet/education fields — FU2 captures: “Is member on medication?”, “Side effects?” (multi-select), “Diet plan provided?”, “Health education session?”. None of these appear as named fields in the doctype. fu_counselling_provided and fu_health_edu_nurse partially cover this but are not comprehensive.
3MISSINGRe-screening raw value fieldsfu_rescreening_hb_status, fu_rescreening_bp_status, and fu_rescreening_diabetes_status store the status labels but the video shows numeric inputs for RS HB Value, RS SBP, RS DBP, and RS RBS first. The actual measurement values are not stored as separate fields in the current doctype.
4MISSING”Reason referral could not be completed” field — in FU1, if the member visited the referral centre but screening wasn’t done, the surveyor selects a reason (e.g., “lab facility not available”). This reason field is not in the current doctype.
5CONFIGURABLEBP age threshold for “NA” status — currently hard-coded in the doctype bp_status options as “NA as the member’s age is less than 13”. The HS_Logics sheet confirms the threshold is 13. This should stay as-is but must be documented for future audits.
6EXTRAstatus_final_score — a data field in the doctype. The video never references a numeric score, only a cumulative status label. Purpose and calculation rule need to be confirmed with PM.
7CONFIGURABLEBMI adult vs adolescent routing logic — the doctype has three BMI status fields (bmi_status_adult, bmi_status_child, bmi_status_adolescent). The routing rule (which field to populate based on age) is not documented. Fahim confirmed Z-score for ages 5–18, WFH for 0–5, standard BMI for ≥ 18. The exact age boundary at 18 needs to be confirmed — is an 18-year-old “adult” or “adolescent”?
8MISSINGExpressed illness child table contentsexpress_illness links to “Health Screening Expressed Illness Item” child table. The list of illness options is not in the main doctype JSON and its V2 source has not been mapped.

Open items for PM (Fahim)

  1. status_final_score field — what does this store? Is it a numeric composite of the four marker statuses, or something else? Is it displayed to the surveyor?
  2. BMI age boundary at 18 — is a member aged exactly 18 classified as adult (kg/m²) or adolescent (Z-score)? The doctype has both fields; which one takes priority at 18?
  3. “Do you want 3rd follow-up?” as a standalone field — should this be added as an explicit Yes/No field in the doctype, or is it implied by the surveyor’s fu_current_status selection?
  4. Follow-up 2 and 3 sub-fields — confirm the complete list: medication adherence (Yes/No), side effects (which multi-select options?), diet plan (Yes/No), health education session (Yes/No). Are these all mandatory?
  5. Re-screening raw values — should RS HB Value, RS SBP, RS DBP, and RS RBS be stored as numeric fields (for trend analysis over time) in addition to the computed status labels?
  6. Referral failure reason options — what are the valid options for “reason referral couldn’t be completed”? The video showed one example (“lab facility not available”). Full list needed.
  7. Expressed illness options — what ailments are in the multi-select list for express_illness? Is this a fixed set or a configurable master?
  8. BP combined status rule — the video shows bp1_systolic_stage, bp1_diastolic_stage, bp2_systolic_stage, bp2_diastolic_stage as four separate staged readings that roll up to bp_status. Confirm: is the final bp_status the maximum stage across all four readings, or the max of the two readings (each reading being the max of its systolic vs diastolic)?
  9. visibleWhen for in_prediabetic / in_diabetic HTML fields — V2 forms 1010 and 1011 disagree on the parent condition for these two interpretation banners (the known visibleWhen conflict logged in audit/out/visible_when_overrides.json). Which form’s rule should V3 use?
  10. Pregnant BMI — the HS_Logics sheet doesn’t list a separate BMI table for pregnant women (only a separate Hb threshold). Confirm: should pregnant women use the adult female BMI thresholds, or is BMI not assessed for pregnant members?

Source files

  • PM video: ~/Dhwani/video-walkthrough/ (Video 2.mp4, transcript.txt, INDEX_dense.md, frames_dense/)
  • HS_Logics spec: raw/pm-design/extracted/HS_Logics.md (thresholds)
  • Screenshot spec: pm-spec/2026-05-20/SPEC.md + pm-spec/2026-05-20/screenshots/hs_*.jpg
  • Doctype JSON: frappe-bench-swasti/apps/mform_swasti/mform_swasti/health/doctype/health_screening/health_screening.json
  • V2 audit patches: audit/out/health_screening.reqd.patch.json
  • V2 form JSON: raw/mform-forms/1010.json (initial), raw/mform-forms/1011.json (follow-up)

This note is the authority for Health Screening. Subsequent PM videos for other forms become notes 13–15.


Last updated 2026-05-04