WikiEduDashboard is the project I picked. It is a website that helps teachers and students run Wikipedia assignments. A teacher makes a course, students join it, and the site tracks what the students edit.
The microtask is called claim verification. The project lead (Rage Soss) asked applicants to try out the "verify claim" exercise as a student would, and share ideas to make it better.
To have ideas about a student's experience, I first have to be a student, on my own computer, with real-looking data. That is the problem this article is about. So, this is the job, and that is the reason for me writing this article: I can't suggest improvements to an exercise/projects I can't use.
Problem Statement
The "Fact Verification Exercise" shows a student a sentence from a Wikipedia article, along with the source that sentence cites. The student then goes to the source and checks whether the sentence is really backed up. This matters because every fact on Wikipedia should be backed by a reliable source.
I tried to experience this as a student and hit two walls:
- On the live demo site (production): every time I clicked "Select this claim to verify", it told me to enroll in the course first.
-
On my own computer (localhost): the page
/courses/Uffizi/WDG_-_AF_2018_Florence/verify_claimsaid "No articles available", so there was nothing to click.
Because of this, I could not go through the exercise like a real student.
What was actually going wrong (the diagnosis)
A fresh local copy of the site/codebase starts with an almost empty database.
| What the page needs | Plain meaning |
|---|---|
| An article | A Wikipedia page the exercise can use (we used "Surrogacy in India") |
| A claim attached to that article | One sentence from the article, plus the source it cites |
| A link between the article and my course | Without it, the article does not show up in the course's list |
| Me, enrolled as a student in that course | Without it, the site refuses with "You must be enrolled in the course" |
My local codebase had none of the first three, so the page was empty with no article showing up for me. The "enroll first" message on production was the same rule showing up in a different place (locally).
The solution
Gabina, someone in the project's Slack, suggested that I fill my local database with fake-but-realistic data. This is optional and just for exploring. Her idea:
- Make sure my local setup already works.
- Make sure I have some course data locally.
- Run two database statements that add one article and one claim.
Then sign in as a student in a local course and open the verify-claim page.
Quote marks must match. The claim sentence has the words "surrogacy packages" in quotes. Gabina's version used plain straight quotes, but the real Wikipedia page uses curly ones. The page finds the sentence by looking for an exact match, so a straight quote and a curly quote look like two different letters to the computer. No match means no purple highlight and no popup.
Link the article to the course. Otherwise it will not show in the Step 1 list.
The plan, step by step
- Get into the local database.
- Check the number that identifies English Wikipedia in my database.
- Add the article and the claim.
- Add more claims, with curly quotes, and link the article to my course.
- Add myself to the course as a student.
- Open the page and try it like a student.
- Clean up, so none of this ends up in GitHub.
Here is what the terminal looks like
Step 1: Getting into the database
I needed the database password. I did not know it, so I looked in the project's settings file, in your terminal run this:
cat config/database.yml
It returned this:
default: &default
adapter: mysql2
encoding: utf8mb4
username: wiki
password: wikiedu
host: 127.0.0.1
port: 3306
pool: 40
development:
<<: *default
database: dashboard
From this you can see that my password is wikiedu
What is config/database.yml is the file that tells the website how to log in to its database. Anything I need to log in myself is in there too.
Step 2: Checking the Wikipedia id
Now, we know our database password. We have to check the Wikipedia id. Gabina's statements assume English Wikipedia has the id number 1 in my database. I checked instead of trusting:
Firstly, Open the database console using this, open a second terminal and run this.
bundle exec rails dbconsole
Then, you can type this SQL syntax in the console to check the Wikipedia id
SELECT id FROM wikis WHERE project = 'wikipedia' AND language = 'en';
Here is what I got
MariaDB [dashboard]> SELECT id FROM wikis WHERE project = 'wikipedia' AND language = 'en';
+----+
| id |
+----+
| 3 |
+----+
1 row in set (0.007 sec)
MariaDB [dashboard]>
Result: 3, not 1. If I had pasted her statements without checking, the article and claim would have been tagged with the wrong wiki. So I swapped 1 for 3 in both statements.
Why it matters: the id is just a label. The article has to carry the label of the wiki it belongs to, and my local label is different from hers.
Since my English Wikipedia id is 3, not 1, so I have to swap it in.
Here are both statements with the change already made. Paste them one at a time, pressing Enter after each.
Statement 1 (the article): This adds one row to the articles table ("Surrogacy in India")
REPLACE INTO articles (id, title, created_at, updated_at, namespace, rating, rating_updated_at, deleted, language, average_views, wiki_id, mw_page_id)
VALUES (376975008, 'Surrogacy_in_India', '2022-11-06 23:16:53', '2026-10-16 11:33:53', '0', 'start', '2026-10-16 11:33:53', '0', NULL, NULL, '3', '25122640');
Statement 2 (the claim): This adds one row to the verification_claims table (one sentence plus its source)
REPLACE INTO verification_claims (id, alert_id, archive_url, article_id, article_title, cite_text, context, courses_users_id, created_at, mw_rev_id, mw_rev_timestamp, offline_source, ref_id, sentence, source_course_id, source_url, subject, updated_at, wiki_id)
VALUES (1060, '459064', NULL, '376975008', 'Surrogacy_in_India', 'Hibino, Yuri (2023-07-07). "The advantages and disadvantages of altruistic and commercial surrogacy in India". Philosophy, ethics, and humanities in medicine: PEHM. 18 (1): 8. doi:10.1186/s13010-023-00130-y. ISSN 1747-5341. PMC 10327345. PMID 37420245.', 'The legal history of commercial gestational surrogacy trace the emergence of commercial gestational surrogacy in India to the early 2000s, when assisted reproductive technologies expanded rapidly and a 2002 court decision was interpreted as legalising commercial surrogacy. Clinics and agencies began offering full "surrogacy packages" to both Indian and foreign clients, and surrogacy was promoted as part of a wider medical tourism strategy.', '264083', '2026-07-01 16:36:49.275569', '1321874993', '2025-11-13 03:47:18.000000', '0', 'cite_note-:0-1', 'Clinics and agencies began offering full "surrogacy packages" to both Indian and foreign clients, and surrogacy was promoted as part of a wider medical tourism strategy.', '19096', 'https://pmc.ncbi.nlm.nih.gov/articles/PMC10327345/', 'LGBT+ Studies', '2026-07-01 16:36:49.275569', 3);
Each should reply with something like Query OK, 1 row affected.
Then type exit to leave the database.
Problem(s): The article showed up on the page, but there was no claim to verify.
Two things were wrong, matching the warnings from the group chat:
Problem 1: the claim doesn’t light up (quote marks)
The page finds the claim by searching for the exact sentence, letter for letter. Gabina’s sentence uses plain straight quote marks around “surrogacy packages”. The real Wikipedia page uses the fancy curly ones. To the computer, those are different characters, so it can’t find the sentence and nothing gets highlighted. Swap in curly quotes and the match works, which brings back the purple highlight and the popup.
Problem 2: the article isn’t connected to your course
Adding the article to the database isn’t enough. It also has to be linked to your course, otherwise it won’t show in the Step 1 list. That’s why you see the article but no claim to verify.
Solution: A script that does all of it
Instead of typing many database statements, I saved a small Ruby script called seed_claims.rb and ran it.
Save the script as a file. In your terminal (still in the WikiEduDashboard folder), copy and paste this whole block in one go, then press Enter:
It does the following:
- Finds English Wikipedia, my course, and the article.
- Links the article to the course.
- Adds nine claims from the History section of the article (so I can also test the "Next claim" and "Previous claim" buttons).
Here is the shape of it
cat > seed_claims.rb <<'RUBY'
wiki = Wiki.find_by(project: 'wikipedia', language: 'en') || Wiki.first
course = Course.find_by(slug: 'Uffizi/WDG_-_AF_2018_Florence')
article = Article.find_by(id: 376975008)
# Link the article to the course so it shows up in Step 1
ArticlesCourses.find_or_create_by(course: course, article: article)
claims = [
{
id: 1060,
sentence: 'Clinics and agencies began offering full “surrogacy packages” to both Indian and foreign clients, and surrogacy was promoted as part of a wider medical tourism strategy.',
context: 'The legal history of commercial gestational surrogacy trace the emergence of commercial gestational surrogacy in India to the early 2000s, when assisted reproductive technologies expanded rapidly and a 2002 court decision was interpreted as legalising commercial surrogacy. Clinics and agencies began offering full “surrogacy packages” to both Indian and foreign clients, and surrogacy was promoted as part of a wider medical tourism strategy.'
},
{
id: 1061,
sentence: 'Estimates by industry groups suggested that surrogacy generated more than US$2 billion annually, with thousands of IVF clinics across the country.',
context: 'Clinics and agencies began offering full “surrogacy packages” to both Indian and foreign clients, and surrogacy was promoted as part of a wider medical tourism strategy. Estimates by industry groups suggested that surrogacy generated more than US$2 billion annually, with thousands of IVF clinics across the country.'
},
{
id: 1062,
sentence: 'Throughout the 2000s and early 2010s, India became a major global destination for transnational commercial surrogacy, attracting heterosexual couples, single intended parents and same-sex couples from abroad.',
context: 'Throughout the 2000s and early 2010s, India became a major global destination for transnational commercial surrogacy, attracting heterosexual couples, single intended parents and same-sex couples from abroad. At the same time, a series of highly publicised cases including deaths of egg donors and surrogates, visa and citizenship disputes, and abandonment of children fuelled concerns about exploitation, inadequate oversight and legal uncertainty.'
},
{
id: 1063,
sentence: 'At the same time, a series of highly publicised cases including deaths of egg donors and surrogates, visa and citizenship disputes, and abandonment of children fuelled concerns about exploitation, inadequate oversight and legal uncertainty.',
context: 'Throughout the 2000s and early 2010s, India became a major global destination for transnational commercial surrogacy, attracting heterosexual couples, single intended parents and same-sex couples from abroad. At the same time, a series of highly publicised cases including deaths of egg donors and surrogates, visa and citizenship disputes, and abandonment of children fuelled concerns about exploitation, inadequate oversight and legal uncertainty.'
},
{
id: 1064,
sentence: 'Draft Assisted Reproductive Technology (ART) Bills were prepared in 2008, 2010 and 2014, and Indian Council of Medical Research guidelines were issued in 2005, but no comprehensive national statute on surrogacy was enacted.',
context: 'At the same time, a series of highly publicised cases including deaths of egg donors and surrogates, visa and citizenship disputes, and abandonment of children fuelled concerns about exploitation, inadequate oversight and legal uncertainty. Draft Assisted Reproductive Technology (ART) Bills were prepared in 2008, 2010 and 2014, and Indian Council of Medical Research guidelines were issued in 2005, but no comprehensive national statute on surrogacy was enacted.'
},
{
id: 1065,
sentence: 'Visa rules for international intended parents were tightened, and in November 2015 medical visas related to surrogacy were suspended, effectively excluding foreign clients from accessing commercial surrogacy in India.',
context: 'From 2012 onwards, the policy direction shifted toward restriction. Visa rules for international intended parents were tightened, and in November 2015 medical visas related to surrogacy were suspended, effectively excluding foreign clients from accessing commercial surrogacy in India.'
},
{
id: 1066,
sentence: 'In 2016 the government introduced the Surrogacy (Regulation) Bill 2016, which proposed banning commercial surrogacy altogether and permitting only altruistic surrogacy for Indian heterosexual married couples who met infertility criteria.',
context: 'Visa rules for international intended parents were tightened, and in November 2015 medical visas related to surrogacy were suspended, effectively excluding foreign clients from accessing commercial surrogacy in India. In 2016 the government introduced the Surrogacy (Regulation) Bill 2016, which proposed banning commercial surrogacy altogether and permitting only altruistic surrogacy for Indian heterosexual married couples who met infertility criteria.'
},
{
id: 1067,
sentence: 'Under this model, surrogates had to be Indian women aged 25–35, already mothers to at least one child, and “close relatives” of the commissioning couple; they could receive reimbursement of medical expenses and insurance but no other payment.',
context: 'In 2016 the government introduced the Surrogacy (Regulation) Bill 2016, which proposed banning commercial surrogacy altogether and permitting only altruistic surrogacy for Indian heterosexual married couples who met infertility criteria. Under this model, surrogates had to be Indian women aged 25–35, already mothers to at least one child, and “close relatives” of the commissioning couple; they could receive reimbursement of medical expenses and insurance but no other payment.'
},
{
id: 1068,
sentence: 'The 2016 bill was examined by the 102nd Parliamentary Standing Committee on Health and Family Welfare, which recommended changes, and subsequently lapsed.',
context: 'The 2016 bill was examined by the 102nd Parliamentary Standing Committee on Health and Family Welfare, which recommended changes, and subsequently lapsed. A revised Surrogacy (Regulation) Bill 2019 was passed by the Lok Sabha and referred to a Rajya Sabha Select Committee.'
}
]
claims.each do |c|
claim = VerificationClaim.find_or_initialize_by(id: c[:id])
claim.assign_attributes(
article_id: article.id,
article_title: 'Surrogacy_in_India',
sentence: c[:sentence],
context: c[:context],
source_url: 'https://pmc.ncbi.nlm.nih.gov/articles/PMC10327345/',
source_course_id: course.id,
wiki_id: wiki.id
# plus a few other fields the table asks for
)
claim.save!(validate: false)
end
puts "Done! Total claims for Surrogacy in India: #{VerificationClaim.where(article_id: article.id).count}"
puts "Linked to course: #{course.title} (#{course.slug})"
RUBY
Run it
bundle exec rails runner seed_claims.rb
What is rails runner runs a script inside the website's world, so the script can use the same tools the website uses (Course, Article, and so on) instead of writing raw database statements.
At the end it should print “Done! Total claims for Surrogacy in India” with a number, then the name and address of the course it linked to.
Then go to localhost:3000/courses/<that course address>/verify_claim, to see if we have articles and a claim
Problem: I got this "You must be enrolled in the course to do that"
The article and claims were now in place, but the page still refused me. This is the same message I saw on production, and the cause is the same: my user account was not a student in that course on my local copy.
The fix is to add myself to the course as a student:
bundle exec rails runner "user = User.find_by(username: 'Chimaifeanyi29'); course = Course.find_by(slug: 'Uffizi/WDG_-_AF_2018_Florence'); CoursesUsers.find_or_create_by(user: user, course: course, role: CoursesUsers::Roles::STUDENT_ROLE); puts CoursesUsers.where(user: user, course: course).count"
If it works, it prints 1. That means you are now a student in the course.
What is CoursesUsers: is the table that says "this person has this role in this course". Having an account is not enough. The site checks this table before it lets you do student things.
Then go back to the browser, refresh localhost:3000/courses/Uffizi/WDG_-_AF_2018_Florence/verify_claim, and the article should show up under Step 1. Click it and the first sentence should light up purple.

Top comments (0)