Ninety steps to a releasable v1.0 — the annotation layer
that no published Qurʾānic dataset supplies.
Plan 90 steps · 13 daysTarget 440 lemmas · 36,575 occurrencesParallel up to 4 windowsOutput dataset + data paper
A correction before you start. I said this needed a year. A
complete sense layer does. What is achievable in thirteen days is a
v1.0 covering the words that carry most of the text, released with an
explicit and honest scope statement. That is normal practice for language
resources and is what LREC and similar venues publish.
Do not claim completeness. Claim exactly what you did: 440 content
lemmas, 73% of content-lemma occurrences, with the expansion path
documented.
The scope, measured
4,776
lemmas total
1,958
occur once — excluded
440
content lemmas, 20+ occurrences
36,575
occurrences in scope
73%
of content-lemma text covered
Why 440 and not 4,776. Function words — wa, al,
min, fī — carry grammatical, not semantic, ambiguity
and are out of scope. 1,958 lemmas occur once and cannot be ambiguous in use.
What is left that matters is 440 nouns and verbs occurring twenty times or
more, and they account for 73% of all content-word occurrences.
Most of the 440 will need no split. On inspection, the majority
resolve to a single sense. Expect roughly 25% — about 110 lemmas
— to be genuinely polysemous and require real work. That is the
thirteen days.
Phase 0 — Decide and freeze
Day 1 · one window
Write a one-page definition of "sense" for this project and commit
it. Proposal: a distinct dictionary meaning of one lemma, such that a
competent translator would render it with a different English word.
Write the exclusion rule: grammatical function, syntactic role and
metaphorical extension are not separate senses. Only lexical meaning
is.
Decide the evidence standard: every sense must be supported by at
least one of — divergence between Pickthall and Yusuf Ali; explicit
discussion in a tafsīr; a distinct grammatical construction.
Freeze the target set: content lemmas (N or V, with a root) having
20 or more occurrences. Write the selection query into the repository so it
is reproducible.
Generate targets.json — the 440 lemmas with counts,
root, POS, forms and āyah list.
Assign each lemma a stable sense-layer ID (SL-0001
…). IDs never change, even if a lemma is later dropped.
Create the repository: 04-SENSE-LAYER/ with
shards/, build/, docs/.
Write SCOPE.md stating what v1.0 covers and, explicitly,
what it does not. This becomes a section of the paper.
Phase 1 — Tooling
Days 1–2 · one window
Define the record schema. One JSON object per lemma. Fields:
id, lemma, root, pos,
total, status, senses[],
annotator, date.
Define the sense object: name, gloss,
basis, confidence, and eitherforms[]orrefs[].
Allow two assignment modes: by form (fast, when spelling separates
the senses) and by reference (slow, when it does not). Record which
was used.
Write sense_schema.py validating every field and type.
Write the exhaustiveness gate: the declared senses must account for
every occurrence of the lemma. No occurrence unassigned, no form claimed
twice.
Make the gate refuse to load on failure rather than warn. This is
the mechanism that stops a count being quietly reduced.
Write make_shards.py: split the 440 targets into four
shards by frequency rank (rank 1,5,9… to shard A; 2,6,10…
to B) so each shard has a comparable mix of hard and easy.
Each shard writes to its own file only:
shards/shard-A.json … shard-D.json. No
window ever writes another window's file.parallel-safe
Write brief.py <lemma-id>: prints everything needed to
judge one lemma — every occurrence with āyah reference, the
Arabic, both public-domain translations, and the surface form.
Extend brief.py to flag translation divergence: mark
occurrences where Pickthall and Yusuf Ali choose different English head
words. This is the strongest cheap signal for polysemy.
Add tafsīr retrieval to brief.py: pull the commentary on
the āyah from the 21 editions, so a disputed occurrence can be checked
against the tradition.
Write record.py: appends a completed lemma record to the
correct shard, validating the schema and running the gate before
writing.
Write progress.py: prints how many of the 440 are done, by
shard, with a projected completion date.
Write merge.py: combines four shards into one dataset,
failing loudly on any duplicate ID.
Test the whole chain end-to-end on three lemmas you already know
— barr, ākhir, rajul — whose senses
are already declared. The tool must reproduce them exactly.
Commit the tooling. Do not change the schema after this point
without re-validating every completed record.
Phase 2 — Triage
Days 3–4 · four windows
The purpose of triage is to separate the 440 into those needing real work
and those that do not. Two to three minutes per lemma. Do not annotate here
— only decide.
Open one window per shard. Give each the shard brief from the appendix
below.parallel
For each lemma, run brief.py and read the divergence
flags first.
Mark status: "single" when both translators consistently use
one English head word and no tafsīr dispute is visible.
Mark status: "split" when translators diverge systematically,
or the lemma clearly names two things.
Mark status: "defer" for anything you cannot decide in three
minutes. Deferring is not failure — it is the honest signal
that the lemma needs a scholar.
For every single, write the single sense and its gloss
immediately. It is a complete record and needs no revisit.
Never mark a lemma single just to move faster. The
exhaustiveness gate cannot catch a wrong judgement, only a missing one.
Log the triage decision time per lemma. You will need the rate to project
completion honestly.
At the end of each session run progress.py and record the
number in a running log.
After the first 40 lemmas, stop and compare the four windows'
decisions on a shared sample of five lemmas.sync
Where windows disagree on the same lemma, that lemma is
defer by definition. Record the disagreement — it is
data about annotation difficulty and belongs in the paper.
Adjust the written definition from step 1 if the disagreements reveal
ambiguity in it, then re-triage everything done so far under the
revised definition.
Complete triage of all 440.
Publish the triage counts: how many single, split, defer. This is your
first real finding.
Phase 3 — Annotate the splits
Days 5–9 · four windows
Expect roughly 110 lemmas here. Twenty to thirty minutes each. This is the
work.
Sort the split list by frequency, highest first. If time runs out,
it must run out on the rare words, not the common ones.
For each lemma, read every occurrence before naming any sense.
Naming senses early biases every assignment after it.
Name each sense with a short English gloss and a one-line
basis stating why it is distinct.
Prefer assignment by form where spelling separates the senses
— it is faster and independently checkable.
Use assignment by reference where it does not. List every
āyah explicitly.
Set confidence per sense: clear,
argued, or disputed.
Any occurrence you are unsure of goes into a sense named
unresolved. The gate must still pass — unresolved
is an assignment, not a gap.
Where a tafsīr explicitly discusses the ambiguity, cite it in
basis. That single line raises the record from opinion to
evidence.
Where the two translators diverge, quote both renderings in
basis. It is the cheapest defensible evidence you have.
Never let a sense have zero occurrences. The gate rejects it, and it
means the sense was imagined rather than found.
Run record.py after every lemma. Do not batch — a
crash must never cost more than one lemma.
Commit after every session, with the count in the commit message.
Every 20 lemmas, re-run the full gate over your whole shard.
Every 20 lemmas, re-annotate one lemma you did earlier without
looking at your previous answer.self-check
Compare the two versions. Disagreement with yourself is the honest
measure of how repeatable the annotation is, and it belongs in the
paper.
Log every self-disagreement. Do not quietly fix them.
At day 7, run progress.py and project the finish date. If it
falls past day 9, cut scope, not care — drop the lowest-
frequency splits and say so in SCOPE.md.
Never solve a schedule problem by lowering the evidence standard.
Windows must not discuss individual lemmas mid-phase. Independence is
what makes the day-10 agreement check meaningful.discipline
Keep a QUESTIONS.md of anything needing a scholar. It is a
deliverable, not an embarrassment.
Finish the top 60 splits by day 7 whatever else slips.
Finish all splits, or formally cut the remainder, by end of day 9.
Freeze annotation. No further edits except to fix validation
failures.
Merge the four shards. Resolve any duplicate ID as a tooling bug, not a
data decision.
Phase 4 — Validate
Days 10–11 · one window
Run the exhaustiveness gate over the merged dataset. Every
occurrence of every annotated lemma must be assigned.
Assert the arithmetic: for each lemma, the sum of sense counts equals the
corpus count. Any mismatch is fatal.
Verify every āyah reference resolves to a real verse.
Verify every declared form actually occurs for that lemma.
Check for senses that differ only in wording — the same distinction
named twice across different lemmas. Harmonise the vocabulary.
Check no lemma has more than five senses without an explicit note. More
than five usually means the definition is being stretched.
Compute and publish self-agreement from the step-52 re-annotations:
the proportion where you reproduced your own assignment.
Compute the cross-window agreement from the step-34 sample.
Report both figures whatever they are. A resource with a stated
agreement rate is usable; one without is not.
Write a clean-room checker that recomputes the counts from the raw
morphology, importing nothing from the annotation tooling.
Run it. Any disagreement is a defect in the layer, not in the
checker.
Take a random sample of 30 assignments and check each by hand against the
āyah.
Publish the sample error rate. If it exceeds 5%, stop and fix before
release.
Add every check above to a single audit_sense.py that must
pass before any release.
Phase 5 — Release
Day 12 · one window
Produce the dataset in two formats: JSON for machines, and a
tab-separated file for people who will open it in a spreadsheet.
Write README.md: what it is, what it covers, what it does
not, how to validate it, how to cite it.
Write SCHEMA.md documenting every field, with an
example record.
Write LIMITATIONS.md. Include the deferred lemmas, the
disputed senses, and the agreement rates.
State the licence. CC BY 4.0 for the annotation; note that the
underlying morphology is the Quranic Arabic Corpus under its own
licence.
Credit the Quranic Arabic Corpus and Tanzil explicitly and prominently.
You are adding a layer to their work, not replacing it.
Deposit to Zenodo and mint a DOI. Tag it v1.0.0.
Publish the annotation tooling in the same deposit. The layer without the
gate is not reproducible.
Phase 6 — The paper
Day 13 · one window
Draft the data descriptor, about 3,000 words: motivation, method, scope,
format, validation, limitations, reuse.
Lead with the gap, stated exactly: published Qurʾānic datasets
supply morphology, syntax and topic. None supplies sense.
Report the agreement rates and the sample error rate in the abstract.
A resource paper that hides them will be asked for them.
Re-run the literature search the morning you submit. Confirm no
sense-annotated Qurʾānic resource appeared while you worked.
Submit to LREC or the Journal of Open Humanities Data, with
the DOI already live.
Add the deferred lemmas and the open questions to the paper as the stated
roadmap for v2.0. The gaps are what invite collaborators.
Running four windows without collisions
The one rule that matters: a window writes only to its own shard
file. Never let two windows edit the same file. Merge at the end, never
during.
Copy this brief into each window
You are working on shard [A|B|C|D] of the Qur'anic sense layer.
WORKING DIRECTORY
C:\Users\walee\Downloads\Quran Research\04-SENSE-LAYER\
YOUR FILE - write ONLY this one
shards/shard-[A|B|C|D].json
DO NOT touch any other shard file, or targets.json, or the tooling.
TASK
For each lemma in your shard:
1. python brief.py <id> - read every occurrence
2. decide: single / split / defer
3. python record.py <id> - writes to YOUR shard only
RULES
- A sense needs evidence: translator divergence, a tafsir discussion,
or a distinct construction. Record which.
- Every occurrence must be assigned. "unresolved" is a valid
assignment; leaving a gap is not.
- If undecidable in three minutes, mark defer. Do not guess.
- Never mark "single" to go faster.
- Commit after every lemma.
REPORT AT SESSION END
python progress.py and paste the output
Day by day
Day
Steps
Output
Windows
1
1–14
Scope frozen, schema and gate written
1
2
15–24
Tooling tested on three known lemmas
1
3–4
25–38
All 440 triaged; split list known
4
5–7
39–59
Top 60 splits annotated
4
8–9
60–62
All splits done or formally cut; merged
4
10–11
63–76
Validated; agreement rates published
1
12
77–84
Released on Zenodo with a DOI
1
13
85–90
Data paper submitted
1
Three ways this fails, named in advance.
Scope creep. The temptation on day 6 will be to add lemmas below 20
occurrences. Refuse. A smaller released resource beats a larger unreleased
one.
Silent standard-lowering. If you fall behind, cut the number of
lemmas and say so in SCOPE.md. Never keep the count by accepting
weaker evidence — that produces a resource nobody can trust, including
you.
Skipping the agreement checks. Steps 52, 69 and 70 feel like
overhead when time is short. They are the only evidence that the annotation
is repeatable, and a resource paper without them will be rejected or asked to
supply them anyway.