wiki-ingest
Use when ingesting canonical PARA-ZK sources into the LLM-Wiki — per-import, delta, uncited, or targeted re-ingest.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when ingesting canonical PARA-ZK sources into the LLM-Wiki — per-import, delta, uncited, or targeted re-ingest.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when reorganizing the existing PARA-ZK LLM-Wiki domain topology.
Use when asked to import, translate, research, or compile something into the vault as a PARA-ZK resource note (file, URL, web, or synthesis).
Use when a query or conversation against the LLM-Wiki produces a durable synthesis worth keeping — a multi-source comparison/connection, or a standard concept the wiki lacks. Proposes filing it back as a new or updated wiki page and writes ONLY on the user's confirmation. Skip one-off lookups and navigation.
Use only when the user explicitly asks to lint or health-check the LLM-Wiki. Never run it as part of ingest or normal wiki work.
Install or refresh PARA-ZK Codex custom agents from the plugin's bundled Claude-style agent definitions. Use when a Codex user wants PARA-ZK workflows such as wiki-ingest to spawn named agents like wiki-weaver, or after installing/upgrading the PARA-ZK plugin in Codex.
Use after implementation to run tier-classified review agents and produce a consolidated verdict.
| name | wiki-ingest |
| description | Use when ingesting canonical PARA-ZK sources into the LLM-Wiki — per-import, delta, uncited, or targeted re-ingest. |
| argument-hint | mode=<uncited|delta|per-import|re-ingest> |
Orchestrate a bounded LLM-Wiki ingest run as Plan → Fill → Synthesize: YOU (the orchestrator)
read the candidates' structure and the existing wiki and decide the whole page structure first, then
spawn one wiki-weaver per planned page to fill it in parallel, then a hub pass builds the navigable
spine. The weaver is para-zk:wiki-weaver in Claude Code, wiki-weaver in Codex (after running the
bundled codex-setup skill).
LLM-Wiki pages are LLM-owned derived synthesis under LLM-Wiki/; canonical knowledge stays in
Resources, PARA, and ZK notes. The wiki is a compounding, interlinked web of concept pages drawn
from the WHOLE canonical base (resources, digests, permanents, subnotes) — pages cross-link, a rich
source spans several pages, and each ingest extends existing pages rather than mirroring sources 1:1.
Cohesion (the right page set, the right granularity, consistent domains, a navigable spine) is a
GLOBAL property, so you decide it yourself, up front, before any page is written — and you do it
HERE in the orchestrator (not in a sub-agent) precisely because you hold THIS conversation: the plan
must reflect what the user actually wants (what to include/skip, domain preferences). You discover
the source set, read each candidate's HEAD (a bounded structural peek — not the full body) plus the
existing wiki, and produce one global plan: the page set, domains, granularity, source→page
assignments, cross-links, and the spine. Then you spawn one wiki-weaver per planned page. Weavers
do the heavy work — full-body reads and the actual writing (create-llm-wiki/update-llm-wiki with
by=<model-id>) — but never decide which pages exist, so they cannot diverge on domains, over-split
a source into micro-pages, or duplicate concepts. You never write wiki prose or read full bodies; you
never edit source notes. Wiki prose mirrors the user's OWN language register, which the weavers
derive from the material.
mode (required) selects what to discover. uncited/delta take no source args; per-import/re-ingest
require one of source_path or source_paths, passed through to para-zk:wiki-ingest-candidates.
type is optional and filters ingestable source kind (resource, digest, permanent, subnote);
use mode=uncited type=resource to inspect existing Resources that have never been cited by the wiki.
mode | Targets |
|---|---|
uncited | all ingestable sources missing an incoming LLM-Wiki citation |
delta | new/uncited sources + sources whose updated is newer than the LLM-Wiki pages citing them (best-effort, via updated timestamps; force-refresh a known change with re-ingest) |
per-import | exactly the given source_path/source_paths |
re-ingest | exactly the given source_path/source_paths, even if already cited/fresh |
On invalid args (source args with uncited/delta, or none with per-import/re-ingest), stop with
the concrete routing error — do not ask the user.
Orient: Run optsidian para-zk:conventions ONCE first for this task, then call
optsidian para-zk:describe / optsidian para-zk:describe type=<t> as reference. Use the
returned invocation style for subsequent para-zk:* calls. Examples below use optsidian;
substitute the native obsidian CLI (obsidian para-zk:…) when optsidian isn't installed —
the two are interchangeable, so use whichever is on PATH.
Confirm the surface exposes para-zk:wiki-ingest-candidates, para-zk:list,
para-zk:read-llm-wiki, para-zk:create-llm-wiki, para-zk:update-llm-wiki, and
para-zk:refile-llm-wiki. If the vault
is unavailable, stop with the CLI error; do not fall back to direct file writes.
Resolve mode: Normalize exactly one mode from {per-import, delta, uncited, re-ingest}. Preserve
limit/offset and optional type when supplied. For targeted modes, preserve exactly one of source_path or
source_paths; for untargeted modes, reject either source selector before doing any reads.
Discover candidates:
optsidian para-zk:wiki-ingest-candidates mode=<mode> [type=<resource|digest|permanent|subnote>] [source_path=<path>|source_paths='<json-or-comma-list>'] [limit=<n|all>] [offset=<n>]
Read the text output. It starts with a candidate count and then one line per candidate:
<path> [<reason>], optionally followed by (stale: <wiki pages>). Candidate reasons are
missing_wiki_citation or source_newer_than_wiki; targeted modes may also report
per_import or reingest_requested. If the command prints error:, stop. If it reports
0 candidates, report that none were returned and stop. If it prints a trailing pagination hint,
plan/ingest only the returned page and report that another bounded page remains; do not auto-page
into a full scan. Collect candidate paths and any stale wiki labels; for subnote candidates,
collect their parent project/area note paths as framing context.
Plan (you, the orchestrator — inline): read enough to decide the global page structure, then decide it.
optsidian read path="<path>" lines=1:200 (frontmatter +
abstract + lead/early sections). If the head does not make the source clear enough to classify,
read FURTHER (more line windows, or grep '^#{1,6} ' for its headings) until you understand it
well enough to place it — reading more of a source when you need it is fine. You just don't
routinely page whole bodies for every source (that's the weaver's job and would overflow you).optsidian para-zk:list type=llm-wiki limit=all for the complete
roster (every <domain>/<concept> path → the domains already in use). Then, for the domains the
candidates touch, read that domain's <domain>/index hub FIRST (read-llm-wiki title="<domain>/index")
— it is the area map and the cheapest way to learn the domain's structure; only read individual
concept pages when the index is insufficient.sections — NOT its own page. A per-source
SUMMARY page (type:"source-summary") only when a work is distinct enough that concept pages
do not cover it. Project-operational / ephemeral material (status memos, test logs, trip
checklists) is NOT a concept — skip it (record why) or fold under a project hub. Prefer FEWER,
denser pages.<domain>/<concept>. Treat a domain as a stable research lineage,
problem area, or system family that can sustain a useful hub — not as a universal umbrella.
Avoid vague catch-all domains such as ai, ml, research, or papers unless the existing
wiki already uses one coherently and the candidate truly cannot fit a narrower lineage. For
broad corpora like "LLM papers", infer the corpus axes from the sources and prefer the
narrowest stable domain that can hold multiple pages (for example scaling-laws,
chain-of-thought, mixture-of-experts, retrieval-augmented-generation, alignment, or
language-models). A method name becomes a domain only when it has enough internal structure
for multiple child pages; otherwise keep it as a concept page under a broader domain. A
one-page domain is acceptable only when it names a durable area expected to grow or when the
existing wiki already uses it as a necessary bridge; otherwise prefer a concept page under the
nearest coherent domain. REUSE a roster domain when a concept fits; mint a new domain only for
a genuinely new area; never near-synonyms (RL vs Reinforcement Learning). Before finalizing
each new domain, write a one-sentence domain rationale in the plan guidance: what stable
lineage/problem area it represents, expected child concepts, and why it is not better placed
under an existing broader/narrower domain. One concept = one page across the whole wiki.sources); set each page's links to the related pages.domain_moves list (title, from_domain, to_domain, reason). Do not hide the
move inside a page write. Apply it only when the user explicitly requested/approved domain
cleanup, using para-zk:refile-llm-wiki title="<current>" domain="<target>"; use
rename-llm-wiki only for same-domain concept-name changes.<domain>/index (create-llm-wiki auto-mints it as an empty
scaffold when the domain's first page is created, so it always exists — you don't create it).
Plan it as type:"hub" with title="<domain>/index" and children = that domain's leaf
titles, for the Synthesize pass to FILL. Add an entity hub (descriptive title) for a large
sub-cluster when it helps.{title, type, existing, sources, sections, links, children, guidance} (type ∈ concept|source-summary|hub) — plus a skipped list with reasons.Fill (leaf pages): for EACH planned page with type concept or source-summary, spawn one
wiki-weaver, IN PARALLEL, with a WeavePacket:
{ "mode": "<mode>", "by": "<model-id>", "page": <the planned page object>,
"plan_pages": ["<every planned page title>", "..."], "context": ["<parent note path>", "..."] }
Inject by from your current model id; plan_pages is every planned title so a weaver's
cross-links resolve to real (current or about-to-exist) pages. One weaver owns one page → leaf
pages do not contend. If a weaver reports remaining_sources (a context boundary), spawn a FRESH
weaver for the SAME page with the remaining paths (its compare-and-swap writes make continuation
safe). Do not post-process a weaver's writes.
Claude Code spawn shape:
Agent({ subagent_type: "para-zk:wiki-weaver", run_in_background: true,
prompt: "Fill this WeavePacket's one page and report per your Output Format.\n\n<WEAVE_PACKET_JSON>" })
Codex (after codex-setup has installed the custom agents into ~/.codex/agents/; if wiki-weaver
is unavailable, stop and tell the user to run codex-setup, then restart Codex):
Spawn a `wiki-weaver` subagent: "Fill this WeavePacket's one page and report per your Output Format.\n\n<WEAVE_PACKET_JSON>"
Synthesize (spine): AFTER the leaf weavers complete (hubs link pages that must already exist),
spawn one wiki-weaver in hub mode for EACH planned type:"hub" page (the per-domain
<domain>/index, plus any entity hub) — same packet shape; a hub page carries page.children
(planned page titles) and no sources. The weaver fills the hub as a RELATIONAL MAP of the area
(grouped children, a one-line gist each, and how they relate) — the LLM's substitute for the graph
view it cannot see. For targeted modes, this refreshes only the hubs your plan lists.
Report launch: Return the mode, the plan summary (counts of concept / source-summary / hub
pages, sources assigned vs skipped), whether has_more was true, and the weaver launch
handle(s). The observable write contract is the weavers' direct page writes succeeding.
Verify on completion (clean-context pass): When the weavers finish, read the touched pages
(read-llm-wiki key=body each). You never generated this prose, so this catches generation slips.
Fix high-confidence orthographic/generation slips in place — malformed Korean syllables where a
wrong 받침/jamo yields a well-formed but wrong word (궤적→궁적, 댄스→댓스, 앉기→앙기) — via
update-llm-wiki key=body op=replace by=<model-id>. Surface (do NOT auto-apply): ambiguous
corrections, any unplanned_concepts weavers reported (so the user can decide whether to plan a
page for them next run), and any semantic findings (contradictions, a leaf missing from its hub,
missing cross-references). If the touched-page volume would bloat your context, isolate this pass
in a freshly spawned verifier sub-agent — but still report rather than auto-apply. (A whole-wiki
health sweep is the separate, human-requested wiki-lint, not part of ingest.)
Fold in conversation-derived insight (optional, human-judged): The background weavers only saw
their packets. If THIS conversation surfaced a genuine, wiki-worthy insight the source bodies alone
do not capture (a synthesis, a key tension, a correction the user raised), fold it into the relevant
touched page(s) via update-llm-wiki key=body op=... by=<model-id> after verification, citing any
canonical source as a backtick `PZ[id]`, keeping links single-direction, and writing any formula
as Obsidian MathJax ($…$/$$…$$, single backslashes, never backtick-wrapped or \(...\)/\[...\]). Guardrails: ONLY
genuine user-surfaced insight — never invent, embellish, or inject tangential conversation; if
unsure whether it belongs, surface it to the user instead of writing it; if nothing genuine
emerged, skip. Report what was folded in.