Pipeline doctor
Skill Iabstergo1/pdf-to-study-kb/.agents/skills/pipeline-doctor
对话式 agent(Claude Code / Codex)驱动的本地知识库编译器:把 PDF/DOCX/PPTX/Markdown 增量编译进一个去重、互联、可复现的 Obsidian 学习知识库。
npx -y skills add Iabstergo1/pdf-to-study-kb --skill pipeline-doctorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Diagnose and safely repair a stuck ingest pipeline using only whitelisted CLI commands — stale vault locks, crashed running stages, corrupt window-done JSON, a forward-only state machine that refuses to re-run preprocessing. Use when the user says "the pipeline is stuck / 状态机卡住了 / the lock won't release / window-done keeps failing / it won't let me re-run profile / diagnose the pipeline". Never for content quality (kb-qa / wiki-lint-semantic), ingesting a source (ingest), post-publish retrospectives (kb-postmortem), or editing skills (skill-evolve); it never hand-writes SQL or edits the SQLite file directly.
SKILL.md
6.0 KB, as published. Nobody here has run it
pipeline-doctor — symptom → diagnosis → safe repair (CLI only)
Recurring pipeline breakages used to be fixed by hand-editing the SQLite state db. This skill replaces
that with a fixed recipe table: every repair goes through a whitelisted scripts/pipeline.py command, so
every state change stays auditable. Never hand-written SQL, never direct edits to the db file.
Project truth: AGENTS.md.
1. Triggers / Non-triggers
- Triggers: "the pipeline is stuck", "状态机卡住了", "the vault lock won't release", "window-done reports a JSON error", "it won't let me re-run profile / re-profile the source", "diagnose the pipeline / what state is the pipeline in".
- Non-triggers (never fire):
- content quality / coverage / audit →
kb-qa; semantic health →wiki-lint-semantic. - adding a book / writing pages →
ingest; post-publish retrospective →kb-postmortem. - "distill this failure into the skill" →
skill-evolve. - anything that would require raw SQL / editing the SQLite file → refuse and explain the CLI path.
- content quality / coverage / audit →
2. Inputs
- The symptom as described by the user + any command stderr.
status/nextoutput (per-source stage/status + next human action).- If windows are involved:
ingest-stats --source <src>for a quick read of window states.
3. Outputs
- A diagnosis (which recipe row matched) and the executed safe repair, or an explicit hand-back when no
recipe matches. Destructive steps (
reset-source --apply) always show their dry-run plan first and wait for the user's confirmation.
4. Dependencies
- CLI whitelist:
status,next,unlock,fail,window-fail,reopen,reset-source,preflight-eval,arbitration-status,lint,ingest-stats,window-done --writes-file. - Truth:
AGENTS.md. Never hand-written SQL; never edit the db file; never delete state by hand.
5. Persisted artifacts
- None by default. Every repair lands as auditable rows written by the CLI itself
(
source_stage_runsgainsreset/reopened/failedmarker rows; locks table viaunlock).
6. CLI commands
python scripts/pipeline.py status # always start here
python scripts/pipeline.py next # derived next human action
python scripts/pipeline.py unlock [--ttl N] # stale vault lock (live locks are refused)
python scripts/pipeline.py fail --source <s> --stage <st> --error "<why>" # crashed running stage
python scripts/pipeline.py window-fail --source <s> --window <w> --error "<why>"
python scripts/pipeline.py window-done --source <s> --window <w> --writes-file <path.json>
python scripts/pipeline.py reset-source --source <s> --to <stage> # dry-run plan
python scripts/pipeline.py reset-source --source <s> --to <stage> --apply # after user confirms
python scripts/pipeline.py reopen --source <s> # finished source, incremental additions
7. Workflow (recipe table)
| Symptom | Diagnose with | Safe repair | Never |
|---|---|---|---|
| vault lock won't release, no ingest is live | status + the lock line | unlock (refuses live heartbeats — if it refuses, the ingest is alive: resume it instead) | breaking a live lock |
a stage sits at running after a crash | status | fail --source --stage --error → retry the stage | deleting the run row |
a window sits at running / wrong writes | ingest-stats | window-fail then redo the window, or window-done --writes-file | editing ingest_progress |
window-done --writes dies on quote-stripped JSON (conda run) | the error message itself | put the array in a UTF-8 file → window-done --writes-file <path> | retrying the same shell quoting |
preprocessing must be re-run but every stage says [skip] (forward-only) | status + preflight-eval | reset-source --to <stage> dry-run → user confirms → --apply → re-run the chain | hand-deleting stage runs |
| a published source needs incremental additions | status | reopen --source (state back to workorder_ready) | reset-source into the ingest segment |
| lint failed and rolled back | Review-Queue report | fix pages (re-apply in-place edits!) → lint again | editing published pages blind |
| arbitration queue unclear | arbitration-status | follow the ingest skill's arbitrate flow | inventing decisions |
| staging eats too much disk | staging-clean --source <s> (dry-run report) | user reviews the three-class list → --apply (guarded: published + assets synced) | deleting staging files by hand |
8. Failure stops / recovery
- No recipe row matches → stop, report exactly what
status/nextshow, hand back to the user. - A live (heartbeating) lock is never broken;
unlockrefusing is a signal to resume, not to force. reset-source --applyonly after the user has seen the dry-run plan and confirmed.- If a repair command itself errors → stop and show the error verbatim; do not improvise around a guard — the guards (InvalidTransition, lock checks, C3 JSON validation) are the protocol, not obstacles.
9. Acceptance criteria
- Every state change went through a whitelisted CLI command (auditable in
source_stage_runs/ locks). - No raw SQL, no direct db-file edits, no guard bypassed.
- Destructive repairs (
reset-source --apply) were user-confirmed with the dry-run plan shown first. - The pipeline is unstuck (verified via
status/next), or the case was explicitly handed back.
Gives 0 of the 12 instructions most databases sql skills give
Counted across 589 of the 662 authors here whose files we hold, read 2026-08-06
- use parameterized queriesin 36 of 589, across 32 files
- use timestamptz for timestampsin 30 of 589, across 12 files
- create indexes concurrentlyin 29 of 589, across 23 files
- index foreign keysin 28 of 589, across 17 files
- use numeric type for moneyin 25 of 589, across 8 files
- select only required columnsin 24 of 589, across 19 files
- use cursor pagination instead of OFFSETin 23 of 589, across 15 files
- add indexes manually on foreign key columnsin 22 of 589, across 11 files
- read individual rule files for detailed explanationsin 18 of 589, across 4 files
- configure connection poolingin 18 of 589, across 16 files
- put equality columns before range columns in indexesin 17 of 589, across 9 files
- normalize to third normal formin 17 of 589, across 8 files
Said here and by no other author read
- start every diagnosis with status
- use only whitelisted CLI commands
- show dry-run plan before destructive repairs
- wait for user confirmation before applying resets
- resume live heartbeating ingests instead of unlocking
- stop and report verbatim on command errors
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.