Split `forgelm/ingestion.py` into a sub-package (`_readers`, `_chunkers`, `_pipeline`) — deferred until the next change that adds a reader or a chunker
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 25/100
Research direction
Start with forgelm/ingestion.py and the _DEFERRED_SPLITS entry in tools/check_module_size.py, then read the deferral row in docs/roadmap/risks-and-decisions.md around line 80. The split must keep every public name importable from its current path, and test patch targets that named the old module need retargeting. Done means the module is a sub-package under the normal size ceiling, the deferral row is removed, and the CHANGELOG cites the ID. The issue is deferred until a reader or chunker change lands, so confirm that condition first.
Written by the indexing model from the issue text.
Description
Deferred work ·
F-PR29-A1-06 / A1-07 / A1-08: ingestion.py· severity Low · cost ~4-8 h · recorded indocs/roadmap/risks-and-decisions.md:80
Summary
forgelm/ingestion.py is a deferred module split: PDF/DOCX/EPUB/TXT/Markdown readers, chunkers and the SFT-JSONL emitter share one file; the seams are already near-independent, which makes this the highest-value split per hour. The module-size guard holds it to a fatal no-growth budget, but nothing pays the debt down until someone takes the split.
Condition or budget
The next change that adds a reader or a chunker
State today (re-checked 2026-10-09)
2110 code lines against a budget of 2110 (1443 at PR #29).
Related
#667 and #668 track how the module-size guard counts lines and accepts budget raises; decide them before relying on a module's budget.
Acceptance criteria
- The module becomes a sub-package along the recorded seams, behaviour-neutral, with every public name still importable from its current path.
- Its
_DEFERRED_SPLITSentry is removed fromtools/check_module_size.pyand every resulting module is under the normal ceiling. - Test patch targets that named the old module are retargeted to the module that resolves the name at call time (the
forgelm/verify.pysplit found five that silently moved). - The row is removed from the deferral table and the CHANGELOG names its ID (the table's removal contract).
Recorded in docs/roadmap/risks-and-decisions.md (read at f94595f) and re-checked against the code on 2026-10-09. The row leaves that table only when the fix is on main, the CHANGELOG names its ID and any promised guard exists.
- Dominant language
- Python
- Stars
- 9
- Forks
- 1
- Avg merge
- 8h 10m
- Merged PRs (30d)
- 5
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from HodeTech/ForgeLM
-
area: dev-tooling bug severity: low source: roadmap wave: 4
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Site: the theme-locked --code-comment grey (#6a6f80) on the dark code surface is 3.8:1, below WCAG AA, in both themes (F-W1-SITE-06)Possibly taken @vortsghost2025 claimed this 1 day ago. Openarea: site bug good first issue severity: low source: review-2026-09 wave: 4
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
-
Choosing-a-trainer table documents KTO rows as {prompt, response, label}, but the KTO loader requires a completion column (F-W1-DOCS-TRAIN-02)Possibly taken @vortsghost2025 claimed this today. Opendocumentation good first issue severity: medium source: review-2026-09 wave: 3
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
documentation good first issue severity: low source: review-2026-09 wave: 4
Difficulty 1/5 1-3 hours Newbie friendliness 80/100
-
documentation severity: medium source: review-2026-09 wave: 3
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
All issues in HodeTech/ForgeLM
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
aws-samples/sample-per-model-bedrock#243 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
FuRongJun-1999/dsh-memory#404 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
bug frontend
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
PennyLaneAI/catalyst#3337 ·
Maintainers usually reply within 1 day
-
Workflow.schedule stops when a cron deadline passes before sleepPossibly taken @HuaTNA claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day