The rules are the government's, not ours
Kosh enforces 61 reasons an EPF claim can be rejected. Each one is written from a published EPFO circular or scheme provision. This page is where you check our work.
The catalogue specifies 80 reasons and 20 of them are not enforced. That gap is the honest part of this page, and it is listed rule by rule further down rather than summarised. The number above is counted from the rule bundle the engine actually loads, at build time. It is not typed into this sentence, and a check in CI fails the build if the two ever disagree.
If EPFO publishes an official machine-readable version of these rules tomorrow, we will delete ours and consume theirs. That is the goal, not a concession.
How a rule is written
Rules are data, not code, so a policy change is an edit and a reviewed diff rather than a deployment. Every rule must carry five things or it does not load: a source document, a clause reference, a URL, a verbatim quote of the clause, and the date we read it. It must also ship with one passing and one failing test.
| Field | Why it's mandatory |
|---|---|
severity | Blocking, will-delay, or advisory. Not everything that is wrong stops a claim. |
owner | You, your employer, the EPFO office, or your bank. Citizens waste weeks acting on things they cannot control. |
depends_on | The fixes have an order. This is what lets us lock steps honestly. |
statutory_days | Drives the countdown and the escalation. |
citation | No citation, no rule. Uncitable rules are quarantined and published as gaps. |
Published gaps
Whole areas we do not cover: exempted-trust establishments, international workers, and the finer EPS pension calculations. We would rather name these than let you assume a green light means everything was checked.
And these 20 specified rules are quarantined, which means the engine never runs them. Each is here for a stated reason, and none of the reasons is "we ran out of time". Three of them are refusals rather than omissions: shipping the rule as written would mislead somebody, so it stays out until it is rewritten.
| Rule | Why it does not run |
|---|---|
B06_OVERLAP | Two spells overlapping is real and reported in HR forums, but no source names it as a rejection cause |
B08_WAGE_MISMATCH | Needs a second reading of the same wage. The case holds one wage per spell, and the PF wage is the ceiling applied to it, not a second reading |
B10_EMPLOYER_NOT_APPROVED | No input distinguishes it from A15_KYC_UNAPPROVED, so both would name the same person to chase |
B13_ESTT_CODE_CHANGED | Establishment code reallocation is visible to the office, not in the member's record |
B16_NCP_UNREPORTED | The input exists in the fixtures. No source states that an unreported non-contributory period causes a rejection |
B17_BREAK_UNCERTIFIED | Same shape as B16: the gap is computable, no source names an uncertified break as a cause |
B18_WAGE_ABOVE_CEILING_UNEXPLAINED | As specified it fires on wage above 15,000 without employer clarification, which is most salaried members in the country. It needs rewriting before sourcing |
C03_TRANSFER_STUCK | A transfer stalled part-way is a state EPFO holds. The case has no notion of a pending transfer or its age |
C04_PREV_DETAILS_DIFFER | The citation is in hand and verbatim. Evaluating it needs identity fields per member ID, and the case holds one identity per person |
C08_ALREADY_SETTLED | The input exists. Nothing found states that a repeat claim against a settled account is refused on that ground, and obviousness is not evidence |
D04_JOINT_ACCOUNT | EPFO accepts joint accounts with a spouse in at least some circumstances, so a blocking rule would tell people to open an account they do not need |
F08_TRANSFERRED_OUT | Nothing sets the input and no source states that a claim against a transferred-out balance is refused on that ground. F07 already explains where the money went |
G01_EPS_UNDER_6M | The six-month bar appears to have been amended in 2024, with reporting putting it in the past tense. Shipping it could tell somebody nothing is payable when something is, which is a false refusal |
G06_REJOINED_EPS | Taking another pension-covered job plausibly bars a withdrawal benefit. Nothing found states the bar |
G09_EPS_NEVER_CREDITED | C05_EPS_NOT_TRANSFERRED already fires on zero pensionable months against a completed spell. Separating them needs contributions modelled per month per scheme |
G10_HIGHER_PENSION_WAGES_NOT_UPLOADED | The Bombay High Court held in April 2026 that EPFO cannot refuse higher pension merely because an employer did not produce documents. Ships as an advisory carrying the case citation, or not at all |
H02_SHARES_NOT_100 | Checking that nominee shares total 100% needs the shares. Only whether a nomination is on record is modelled |
H06_FAMILY_NOT_ON_RECORD | That an unrecorded spouse and children delay a family claim is plausible and implied by A08, which does ship. Nothing states it as a cause of refusal |
H07_HEIR_DISPUTE | A contested claim is a state EPFO holds, and the remedy is a succession certificate from a court rather than anything Kosh can sequence |
H08_RELATIONSHIP_UNPROVEN | No source. Overlaps H01, whose remedy already asks for the legal heir certificate that would establish the relationship |
The 4 rules that rest on a field report
A rule with no primary citation still runs, because a rejection people actually receive is real whether or not a circular describes it. But it is labelled Tier F and named here, so it never passes as equally well founded. A rule with no citation at all does not load: the build refuses it.
| Rule | Tier | What it rests on |
|---|---|---|
A03_NAME_VS_PAN | F | Member-reported EPFO PAN seeding error, Quora, question thread |
B09_NO_REMITTANCE | F | Member-reported EPFO claim error, Quora, question thread |
C06_BANK_MULTI_MAPPED | F | Member-reported EPFO rejection message, Quora, question thread |
G05_EARLY_PENSION_PENALTY | F | Practitioner commentary on EPS early pension, Quora, answer thread |