Add a reference, and optionally archive it
A thin wrapper. It runs two skills that each work perfectly well alone, and its
only job is to run them in the right order and ask the question between them.
It owns no logic. If you find yourself implementing anything here, it belongs
in one of the two skills instead.
Why this exists
ysonet-curate-research-links owns the reading lists. ysonet-archive-references
owns the archive. The maintainer decided on 2026-08-03 that neither should know
about the other: curation must keep working with the archive tool absent, and the
archive must never edit a curated document.
That leaves one gap, which is this skill: somebody adding a link usually also
wants the local copy, and should be asked rather than made to remember a second
command.
Steps
Curate. Invoke ysonet-curate-research-links with the URL or the request,
and let it do its whole job: vetting, placement on the right list, the
annotation, and its own link check. Do not second-guess it, and do not edit
the reading lists yourself.
Report what it did. Which list, which section, and the annotation. If it
rejected the source, say why and stop: there is nothing to archive.
Ask. Exactly one question, and honour a "no" without arguing:
Added to <list>. Do you also want a local Markdown copy in the archive?
It preserves the page so the technique survives the source going offline.
Costs one fetch. Answering no changes nothing.
Archive, only if asked. Invoke ysonet-archive-references and run its
single-reference path for that URL:
python tools/references/refs.py check --only <url>
python tools/references/refs.py acquire --only <url>
python tools/references/refs.py index
python tools/references/refs.py verify
Write the two human sections in the new file: ## Why it is in ysonet
and ## Summary. The tool cannot write those and leaves them marked as not
written.
Rules
- Never skip step 3. Archiving is a separate, deliberate act. Doing it
silently is exactly what the boundary exists to prevent.
- If the archive tool is missing or broken, step 1 still stands. Report the
failure and leave the curated list as it is. A broken archive must never make
adding a link fail.
- Never edit
docs/dotnet-deserialization-research.md or docs/references.md
from here. Only the curation skill writes those.
- Run
ysonet-curate-research-links on its own when the user only wants the
link, and ysonet-archive-references on its own when they only want the
archive refreshed. This wrapper is a convenience, never a gate.
1---2name: ysonet-add-reference3description: Add a reference, and optionally archive it4---56# Add a reference, and optionally archive it78A thin wrapper. It runs two skills that each work perfectly well alone, and its9only job is to run them in the right order and ask the question between them.1011**It owns no logic.** If you find yourself implementing anything here, it belongs12in one of the two skills instead.1314## Why this exists1516`ysonet-curate-research-links` owns the reading lists. `ysonet-archive-references`17owns the archive. The maintainer decided on 2026-08-03 that neither should know18about the other: curation must keep working with the archive tool absent, and the19archive must never edit a curated document.2021That leaves one gap, which is this skill: somebody adding a link usually also22wants the local copy, and should be asked rather than made to remember a second23command.2425## Steps26271. **Curate.** Invoke `ysonet-curate-research-links` with the URL or the request,28 and let it do its whole job: vetting, placement on the right list, the29 annotation, and its own link check. Do not second-guess it, and do not edit30 the reading lists yourself.31322. **Report what it did.** Which list, which section, and the annotation. If it33 rejected the source, say why and stop: there is nothing to archive.34353. **Ask.** Exactly one question, and honour a "no" without arguing:3637 > Added to `<list>`. Do you also want a local Markdown copy in the archive?38 > It preserves the page so the technique survives the source going offline.39 > Costs one fetch. Answering no changes nothing.40414. **Archive, only if asked.** Invoke `ysonet-archive-references` and run its42 single-reference path for that URL:4344 ```text45 python tools/references/refs.py check --only <url>46 python tools/references/refs.py acquire --only <url>47 python tools/references/refs.py index48 python tools/references/refs.py verify49 ```50515. **Write the two human sections** in the new file: `## Why it is in ysonet`52 and `## Summary`. The tool cannot write those and leaves them marked as not53 written.5455## Rules5657- **Never skip step 3.** Archiving is a separate, deliberate act. Doing it58 silently is exactly what the boundary exists to prevent.59- **If the archive tool is missing or broken, step 1 still stands.** Report the60 failure and leave the curated list as it is. A broken archive must never make61 adding a link fail.62- **Never edit `docs/dotnet-deserialization-research.md` or `docs/references.md`63 from here.** Only the curation skill writes those.64- Run `ysonet-curate-research-links` on its own when the user only wants the65 link, and `ysonet-archive-references` on its own when they only want the66 archive refreshed. This wrapper is a convenience, never a gate.