# Citation Anchoring

> Regression-check citation anchoring (citations stay in the same subsection) to prevent “polish drift” that breaks claim→evidence alignment.

- Skill: `willoscar/citation-anchoring` (Agent Skill)
- Install (CLI): `npx skillmds add willoscar/citation-anchoring`
- Raw SKILL.md: https://api.skillmd.com/api/skills/willoscar/citation-anchoring/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: WILLOSCAR (https://skillmd.com/u/willoscar)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/willoscar/citation-anchoring

---


# Citation Anchoring (regression)

## Triggers & routing

- **Trigger**: citation anchoring, citation drift, regression, cite stability, 引用锚定, 引用漂移.
- **Use when**: after editing/polishing, you want to confirm citations did not migrate across `###` subsections.


Purpose: prevent a common failure mode: polishing rewrites text and accidentally moves citation markers into a different `###` subsection, breaking claim→evidence alignment.

## Inputs

- `output/DRAFT.md`
- `output/citation_anchors.prepolish.jsonl` (baseline; created by `draft-polisher` on first run)

## Outputs

- `output/CITATION_ANCHORING_REPORT.md` (PASS/FAIL + drift examples)

## Baseline policy

- `draft-polisher` captures a baseline once per run: `output/citation_anchors.prepolish.jsonl`.
- Subsequent polish runs should keep per-H3 citation sets stable.

## Workflow (analysis-only)

Role:
- **Auditor**: only checks and reports; does not edit.

Steps:

1) Load the baseline anchors.
2) Parse the current `output/DRAFT.md` into `###` subsections and extract citation keys per subsection.
3) Compare current sets to baseline sets:
- keys added/removed within a subsection
- keys that migrated across subsections
4) Write `output/CITATION_ANCHORING_REPORT.md`:
- `- Status: PASS` only if no drift is detected
- otherwise, `- Status: FAIL` with a short diff table + examples

## Notes

If you intentionally restructure across subsections:
- delete `output/citation_anchors.prepolish.jsonl` and regenerate a new baseline (then treat that as the new regression anchor).

## Troubleshooting

### Issue: baseline anchor file is missing

Fix:
- Run `draft-polisher` once to generate `output/citation_anchors.prepolish.jsonl`, then rerun the anchoring check.

### Issue: citations intentionally moved across subsections

Fix:
- Delete `output/citation_anchors.prepolish.jsonl` and regenerate a new baseline (then treat that as the new regression anchor).

