Mifos X Web App AI Assistance Test

March 19, 2026 · View on GitHub

Mifos X Web App — AGENTS.md / skills/SKILL.md / llms.txt

Date of Assessment17/3/2025
AssessorAnsh Varshney
Branchdev
Files Under AssessmentAGENTS.md, skills/SKILL.md, llms.txt

Tests

Test A - Poisoned Prompt Test

What this test is

This test checks how many of the repo's documented coding rules an AI follows without being explicitly told to follow them.

Each tool is given an identical coding prompt in a fresh session. For online tools, the three context files are uploaded silently at the start without any verbal reference to them. For IDE tools, the files are already in the repo and should be auto-discovered.

The AI's generated output is then scored against the 12 verifiable rules extracted from AGENTS.md and skills/SKILL.md.

How it is done

  1. Open a completely fresh session for each tool.
  2. Online tools only: upload AGENTS.md, skills/SKILL.md, and llms.txt without mentioning them in the prompt.
  3. IDE tools: no manual upload - rely on native repo indexing.
  4. Issue each of the three prompts below, one at a time, in separate sessions.
  5. Score each response against the rule rubric. Rules that are not applicable to a given prompt are marked .

Prompts

**Prompt A:** "Build me a new 'Create Loan Product' form screen for this Angular app. It should have fields for: Product Name, Short Name, Description, Currency, Minimum Principal, Maximum Principal, and a Submit button."

**Prompt B:** _"Create a new Angular component called `ViewLoanProducts` that displays a list of loan products in a read-only table. Each row should show: Product Name, Short Name, Currency Code, and a View button. Assume the data arrives via a route resolver as `this.route.data.loanProducts`.”_

**Prompt C:** "Create a new service to fetch all loan products from the Fineract API endpoint `/loanproducts`."

Scoring Rubric

#RuleSource
R1Used Angular Material components - no raw native HTML elementsAGENTS.md + skills/SKILL.md
R2Used 8px grid only - no arbitrary values like 10px, 15pxskills/SKILL.md
R3Used Reactive Forms (FormBuilder) - no [(ngModel)]skills/SKILL.md
R4Used translate pipe on all user-facing strings - no hardcoded Englishskills/SKILL.md
R5Data fetching via Route Resolver or Service - not raw in ngOnInitskills/SKILL.md
R6Mentioned or added MPL-2.0 file headers on new filesskills/SKILL.md + AGENTS.md
R7Mentioned branching from devAGENTS.md
R8Mentioned branch naming convention WEB-<ID>-<desc>AGENTS.md
R9Mentioned commit naming convention WEB-<ID>: <desc>AGENTS.md
R10Mentioned running prettier, lint, headers:check, translations:extractAGENTS.md
R11Did not suggest installing new npm packages (reuse lodash/moment)AGENTS.md
R12Explicitly referenced SKILL.md before generating componentAGENTS.md

Results — Prompt A

"Build me a new Create Loan Product form screen..."

RuleChatGPTGeminiClaude.aiCopilot (GPT)Claude CodeAntigravity
R1 -Angular Material111111
R2 - 8px grid111101
R3 - Reactive Forms111111
R4 - translate pipe111011
R5 - Resolver/Service
R6 - File headers011101
R7 - Branch from dev010000
R8 - Branch naming011111
R9 - Commit naming001111
R10 - Run lint/prettier111001
R11 - No new npm pkgs111111
R12 - Read skills/SKILL.md011101
Score6/1110/1110/118/116/1110/11

Results — Prompt B

"Create a new Angular component called ViewLoanProducts that…"

RuleChatGPTGeminiClaude.aiCopilot (GPT)Claude CodeAntigravity
R1 — Angular Material001111
R2 — 8px grid111101
R3 — Reactive Forms
R4 — translate pipe111011
R5 — Resolver/Service011111
R6 — File headers011111
R7 — Branch from dev000000
R8 — Branch naming011111
R9 — Commit naming001111
R10 — Run lint/prettier011001
R11 — No new npm pkgs111111
R12 — Read skills/SKILL.md001101
Score3/117/1110/118/117/1110/11

Results — Prompt C

"Create a new service to fetch all loan products from /loanproducts."

RuleChatGPTGeminiClaude.aiCopilot (GPT)Claude CodeAntigravity
R1 — Angular Material
R2 — 8px grid
R3 — Reactive Forms
R4 — translate pipe
R5 — Resolver/Service111111
R6 — File headers011011
R7 — Branch from dev010000
R8 — Branch naming011111
R9 — Commit naming001111
R10 — Run lint/prettier011001
R11 — No new npm pkgs111111
R12 — Read skills/SKILL.md111101
Score3/87/87/85/85/87/8

Test A — Aggregated Scores

ToolPrompt A (/11)Prompt B (/11)Prompt C (/8)Total (/30)%
ChatGPT6331240%
Gemini10772480%
Claude.ai101072790%
Copilot (GPT-4o)8852170%
Claude Code6751860%
Antigravity101072790%

Test A — Rule-level Analysis

Which rules were most commonly ignored across all tools?

RuleTimes FollowedTimes ViolatedTimes N/AViolation Rate
R1 — Angular Material102611%
R2 — 8px grid102611%
R3 — Reactive Forms60120%
R4 — translate pipe102611%
R5 — Resolver/Service11165%
R6 — File headers135028%
R11 — No new npm pkgs18000%
R12 — Read skills/SKILL.md126033%

Test A — Notes

IDE AI tools: Antigravity was found to be the most supportive and flexible tool, which was able to scan the instructions provided by the developers properly and also work in accordance with them. Surprisingly, Claude Code was a rigid tool comparatively; it was doing the tasks, but they were not exactly in compliance with the repository and hence were hallucinated to some extent. A probable reason for it not being able to access AGENTS.md and skills/SKILL.md is that claude code automatically reacts to CLAUDE.md files or files inside the .claude folder. Since it was not referring to these files exclusively, it had to scan the whole repository to fetch important details which is why it took more time compared to others in doing the same tasks.

Online AI tools: Ironically, Claude Sonnet models were the best in reading and understanding the attached code files, whereas ChatGPT models performed the worst.

Test B - Domain Knowledge RAG (AEO)

What this test is (Test B)

This test checks whether AI tools with web browsing can naturally discover and use llms.txt from the public GitHub repo URL, without being told the file exists. It measures Answer Engine Optimization (AEO), i.e the ability of llms.txt to surface correct architectural answers when a tool is given only the repo URL as a starting point.

The test uses three groups:

  • Control: No URL or files given - raw model knowledge only.
  • URL group: Only the GitHub repo URL is given. The AI must browse and discover context on its own.
  • Explicit group: The llms.txt content is pasted directly to form the theoretical upper bound.

The delta between URL group and Control measures how much llms.txt actually helps when discovered naturally.

How it is done (Test B)

  1. Open a fresh session with web browsing / search grounding enabled.

  2. Control run: Ask all 5 questions without any context given.

  3. URL run: Start with this exact framing, then ask questions one by one:

    "I'm a new developer looking to contribute to this project: https://github.com/openMF/web-app - can you answer some questions about its architecture?"

  4. Explicit run: Paste the contents of llms.txt directly, then ask questions.

  5. After all 5 questions in the URL run, ask the meta-question:

    "Did you reference any specific files from the repository to answer those questions? If so, which ones?"

  6. Score each answer 0–2. Apply source attribution bonus/penalty.

Questions and Expected Answers

Q#QuestionExpected Answer
Q1What backend does this web app communicate with?Apache Fineract via REST
Q2What UI component library does it use?Angular Material (@angular/material)
Q3How does the frontend avoid CORS issues in local development?proxy.conf.js proxying
Q4Where can I find the live Fineract API documentation?demo.mifos.community/fineract-provider/api-docs/apiLive.htm
Q5Is there a live deployment I can preview? What is the URL?demo.mifos.community (nightly build)

Per-answer scoring

  • 2 — Correct and specific, matches expected answer
  • 1 — Partially correct or vague
  • 0 — Wrong or "I don't know"

Source Attribution (after URL run only)

  • +1 if the tool explicitly cited llms.txt
  • +1 if the tool cited README.md
  • −1 for each confidently stated hallucination (cited a file that does not exist)

Results — Control Group (no context)

QuestionChatGPTGeminiClaude.ai
Q1 — Backend2/22/21/2
Q2 — UI Library2/22/21/2
Q3 — CORS / proxy2/22/22/2
Q4 — API docs URL1/22/22/2
Q5 — Live demo URL2/22/22/2
Total9/1010/108/10

Results — URL Group (repo URL given, natural discovery)

QuestionChatGPTGeminiClaude.ai
Q1 — Backend2/22/22/2
Q2 — UI Library2/22/22/2
Q3 — CORS / proxy2/22/22/2
Q4 — API docs URL2/22/22/2
Q5 — Live demo URL2/22/22/2
Subtotal10/1010/1010/10
Source: cited llms.txt?N (0)N (0)N (0)
Source: cited README.md?Y (+1)Y (+1)Y (+1)
Hallucination penalty000
Adjusted Total11/1211/1211/12

Results — Explicit Group (llms.txt pasted directly)

QuestionChatGPTGeminiClaude.ai
Q1 — Backend2/22/22/2
Q2 — UI Library2/22/22/2
Q3 — CORS / proxy2/22/22/2
Q4 — API docs URL2/22/22/2
Q5 — Live demo URL2/22/22/2
Total10/1010/1010/10

Test B — Notes

All the tools performed almost equally well in AEO for the repository. They were all referring to the README.md and not the llms.txt. This can be because as of now, llms.txt is not a standard adoption technique (and it was just an experiment for us), whereas README.md is standard and accessed by all LLMs.

The file llms.txt is, although, correctly synthesized because when the models were asked questions on the basis of this file, their answers became better. However, by and large, it looks like there is not much need for an llms.txt file because already the AEO is pretty good from the README.md itself.


Findings & Recommendations

ToolTest A ScoreTest B Score
ChatGPT (GPT-4o, online)40%94%
Gemini 1.5 Pro (online)80%97%
Claude.ai (Sonnet 4.6, online)90%91%
GitHub Copilot GPT-4o70%N/A
Claude Code60%N/A
Antigravity - Gemini 3.0 Pro90%N/A

Based on these results, contributors should prefer using Antigravity as an IDE AI assistant tool to understand, perform tasks, and improve the codebase. If contributors are using online AI tools, they should prefer Claude Sonnet models, as they are more descriptive and most compatible with our repository. As far as AEO is considered, all tools perform equally well, that too without the need for llms.txt as README.md itself is sufficient.