argument-selfloop
Argument Self-loop (write -> self-check -> ledger -> revise)
Purpose: upgrade C5 from “generate text” to “execute argument actions under explicit constraints”.
This skill operationalizes the mechanism you described as a reusable, pipeline-native component:
- write section-by-section
- self-check paragraph-by-paragraph
- maintain a small argument ledger that makes dependencies explicit
- revise only what fails until the chain is continuous
It complements (not replaces) the other self-loops:
evidence-selfloop: blocks writing when packs are not writeable (do not pad)writer-selfloop: blocks template voice, missing sections/leads, scope/citation violationsargument-selfloop(this skill): blocks argument discontinuity and premise drift (even when prose is fluent)
Core idea: two intermediate artifacts (never in the paper)
This skill treats “argument structure” as a first-class intermediate artifact, like evidence packs.
Outputs:
output/SECTION_ARGUMENT_SUMMARIES.jsonl(structured; per-section/per-paragraph argument moves)output/ARGUMENT_SKELETON.md(compact narrative + dependency map; not a prose restatement)output/ARGUMENT_SELFLOOP_TODO.md(PASS/FAIL + actionable edits)
These files are not reader-facing and must never be merged into output/DRAFT.md.
Downstream:
paragraph-curatorusesoutput/SECTION_ARGUMENT_SUMMARIES.jsonl(moves/outputs) + the## Consistency Contractto run a controlled select->evaluate->subset->fuse pass without changing citation keys.
What this self-loop enforces (your 3 invariants)
After you complete a section (H3 or key front matter), the section must satisfy:
- Correct narrative linkage (paragraph-to-paragraph)
- the relation between adjacent paragraphs is explicit (cause/contrast/refinement/boundary)
- no silent topic-switch; no “jump cut”
- Closed argument loop (section-level) The section answers, in its own text (not in a hidden outline):
- what question is it resolving?
- what argument path does it take?
- what is the conclusion?
- what premises does the conclusion rely on?
- Premises + definitions are explicit and stable
- new terms / protocol assumptions are defined at first use
- the definition matches global usage (no drift)
- task/metric/constraint assumptions do not silently change across sections
The self-check must result in concrete edits: add a missing definition, add a bridge sentence, add an explicit contrast, add a scope boundary, delete/reorder a paragraph, or strengthen the local conclusion.
Paragraph contract (argument actions)
Every paragraph must execute at least one argument action and be locally self-consistent. Use this action set (can be combined, but never empty):
Claim: a testable judgement/conclusion (avoid generic background)Definition/Setup: introduce a concept, assumption, task definition, protocol, comparison setJustification: reasoning chain or evidence support (including citations)Contrast/Differentiation: clarify differences, remove ambiguityBoundary/Failure: applicability limits, failure modes, threats to validityLocal Conclusion: a reusable takeaway / constraint that downstream paragraphs can rely on
One-sentence self-check (per paragraph):
- "This paragraph’s action(s) are: <…>. Its output is: <…>."
If you cannot answer, the paragraph must be rewritten/merged/split until the action and output are clear.
How to run it (LLM-first workflow)
- Pick the scope of this pass
- default: run it after
writer-selfloopPASS, before merge - incremental: run it after finishing 1-2 H3s, so you catch drift early
- For each target section file (start with H3 bodies)
- read the section
- do a paragraph-by-paragraph action labeling in the ledger, not in the prose
- identify failures (missing definition, missing bridge, missing conclusion, implicit premise)
- apply the fix to the section file (
sections/S<sub_id>.md) without changing citation keys
- Update the two-level ledger
- write/update the record for that section in
output/SECTION_ARGUMENT_SUMMARIES.jsonl - update
output/ARGUMENT_SKELETON.mdso it reflects:- the section’s functional role in the paper
- what premises it consumes
- what conclusions/definitions it produces for downstream sections
- Write
output/ARGUMENT_SELFLOOP_TODO.md
- Status: FAIL+ a list of concrete edits when any section fails- Status: PASSonly when all required sections are coherent and premises are stable
- Rerun until PASS
Output contract
output/ARGUMENT_SELFLOOP_TODO.md
Must exist and start with:
- Status: PASS|FAIL
Recommended structure (keep it short and debuggable):
## Failures (blocking)## Fix plan (actionable edits)(per file)## Premise drift watchlist (non-blocking)
output/SECTION_ARGUMENT_SUMMARIES.jsonl
JSONL (one record per section/subsection).
Required fields per record:
kind:h3|front_matter|discussion|conclusion(minimal set)id: for H3 use the subsection id (e.g.,"3.2")titlesection_id,section_title(for H3)section_role: what this unit does in the paper (e.g.,mechanism,evaluation_lens,risk_lens,synthesis)depends_on: list of premises/definitions it assumesadds: list of premises/definitions/conclusions it introducesparagraphs: list of objects, each with:i(1-based paragraph index)moves(non-empty list; pick from:claim,definition_setup,justification,contrast,boundary_failure,local_conclusion)output(one sentence: what this paragraph produces)
Notes:
- This is an intermediate ledger: short, structural, no prose restatement.
- Do not paste long sentences from the draft. Use short summaries.
output/ARGUMENT_SKELETON.md
A compact narrative/dependency map (not a retelling of the paper).
It should include:
- each H2/H3's necessity (what gap it fills)
- explicit dependencies (premises consumed, outputs produced)
- a global Consistency Contract section (single source of truth) that must not drift across edits:
- canonical terminology + synonym policy (what to call the same thing)
- task/environment/threat-model boundary (what counts as in-scope)
- evaluation protocol fields that make numbers interpretable (task + metric + constraint/budget/tool access)
- comparison set naming policy (baseline families; avoid drifting labels)
Minimum format requirement:
output/ARGUMENT_SKELETON.mdmust contain a heading line:## Consistency Contract
Change rule (regression trigger):
- If you change any definition/protocol assumption/term naming, update the Consistency Contract first, then revise the affected
sections/*.mdto match, and rerun this self-loop until PASS.
Keep it "writer-facing": no reader signposting, no “in this section we…”.
Routing rules (avoid polishing around missing substance)
- If a section cannot produce a justified claim without new evidence: STOP and route to
evidence-selfloop. - If a section fails due to template voice / missing citations / out-of-scope keys: route to
writer-selfloop/citation-*first. - This skill is for argument continuity and premise hygiene, not for adding new facts.
Script (validator-only)
This skill includes a validator script so the pipeline can block on missing ledgers. It does not write prose; it only checks that the required artifacts exist and that the ledger covers all H3s.
Quick Start
python .codex/skills/argument-selfloop/scripts/run.py --workspace workspaces/<ws>
All Options
--workspace <dir>--unit-id <U###>--inputs <semicolon-separated>--outputs <semicolon-separated>--checkpoint <C#>
Examples
- Validate the ledgers exist + are PASS + cover all H3:
python .codex/skills/argument-selfloop/scripts/run.py --workspace workspaces/<ws>