willoscar/paragraph-curator
| Deterministically compact final H3 bodies to the active delivery profile's paragraph budget without deleting prose or changing citation-block order.
npx skills add https://github.com/WILLOSCAR/research-units-pipeline-skills --skill paragraph-curator
Compact paragraph boundaries without performing a new semantic rewrite.
This is a deterministic convergence step. It prevents a long drafting loop from
leaving sections outside the delivery profile, while keeping the original prose
and evidence recoverable. It does not rank paragraphs, generate alternatives,
replace evidence, or decide which claims are important.
sections/S<subsection-id>.mdqueries.md for draft_profileOnly H3 files are modified. Front matter (S1.md, S2.md), H2 lead files, and
global sections are not touched.
| Profile | Paragraphs per H3 |
|---|---:|
| course_paper | 5-7 |
| survey | 10-12 |
| deep | 11-13 |
The script first joins short adjacent body paragraphs while respecting the
profile floor. If a section remains over budget, it repeatedly joins the
shortest eligible adjacent pair. It never truncates a paragraph or drops a
middle block.
sections/output/PARAGRAPH_CURATION_REPORT.mdsections/paragraphs_curated.refined.ok on PASSThe report records the active profile and before/after paragraph counts for
each H3. PASS requires every H3 to be within budget and the sequence of
citation blocks to be unchanged. On FAIL, the marker is removed.
subsection-writer or the relevantevidence unit. Compaction must not invent padding.
writer-selfloop orsection-logic-polisher. This Skill changes paragraph boundaries, not ideas.
argument-selfloop after this Skill so the argument ledger and sectionmanifest describe the final section content.
uv run python .codex/skills/paragraph-curator/scripts/run.py \
--workspace workspaces/<name>
Optional runner fields are --unit-id, --inputs, --outputs, and
--checkpoint.
Take willoscar/paragraph-curator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.