kb-qa — post-publish / pre-save QA report
Run broad QA over the published vault or a pre-save candidate: coverage, evidence spot-checks, formula screenshot spot-checks, concept pollution, an ljg-qa-style Q-chain. Produces a report and Review-Queue proposals only; it does not edit content pages.
1. Triggers / Non-triggers
- Triggers: "run a KB QA", "audit coverage", "spot-check evidence", "run the Q-chain", "check for concept pollution", "pre-save QA".
- Non-triggers: "semantic health check", "find contradictions", "does the comparison cover the key dimensions", "Q2 added value" belong to
wiki-lint-semantic; handling an existing Review-Queue useskb-review; read-only Q&A useskb-query; a new source usesingest. kb-qa andwiki-lint-semanticare mutually exclusive on triggers.
2. Inputs
- Scope: whole vault, a domain, a source, a query-session, or a proposed write candidate.
- Read:
wiki/index.generated.md,wiki/concepts/_registry.yaml, and the relevant source/concept/topic/comparison/synthesis/lesson pages. - May read:
pipeline-workspace/query-sessions/<run_id>/,wiki/Review-Queue/, the deterministiclintresult.
3. Outputs
pipeline-workspace/reports/kb-qa/<run_id>.md: the QA report.- For actionable findings, write
wiki/Review-Queue/kb-qa-<YYYY-MM-DD>.mdproposals; no direct content-page edits. - The report covers scope, the Q-chain, sampled items, findings, risk level, and the suggested follow-up skill (usually
kb-review).
4. Dependencies
- CLI:
python scripts/pipeline.py status; if neededpython scripts/pipeline.py lint --source <source_id>. - Protocols:
docs/skill-runtime/schema.md,save-back-policy.md,concept-resolution.md. - Triggers mutually exclusive with
wiki-lint-semantic: semantic-health words are not handled here.
5. Persisted artifacts
pipeline-workspace/reports/kb-qa/<run_id>.md.wiki/Review-Queue/kb-qa-<YYYY-MM-DD>.md(only when an actionable finding exists).- The spot-check list: sampled pages, evidence refs, and Q-chain conclusions recorded in the report.
6. CLI commands
python scripts/pipeline.py status
python scripts/pipeline.py lint --source <source_id>
This skill never promotes, rolls back, or edits content pages; fixes go to kb-review or the matching write skill.
7. Workflow
| Sub-unit | Input | Output | Acceptance | Persisted | Failure stop |
|---|---|---|---|---|---|
| QA1 scope | request + index | scope and samples | does not hijack wiki-lint-semantic triggers | report draft | scope unclear |
| QA2 status background | source/status/lint | deterministic background | does not re-implement deterministic lint | report | lint already blocked |
| QA3 Q-chain | in-scope material | question→evidence→judgement→action | every Q has an evidence path | report | evidence thin |
| QA4 spot-check | page/formula/evidence samples | spot-check results | samples and conclusions traceable | report | sample missing |
| QA5 file findings | actionable findings | Review-Queue proposal | no content-page edits | kb-qa proposal | duplicate proposal |
Evidence discipline (two rules that cost real rework when broken)
A "not in the source" verdict requires an exhaustive search, and the search must be shown. Before
writing that a term/number/mechanism is absent, search the source for the Chinese rendering, the English
name, the abbreviation, and case/hyphen variants — then record every search term in the finding. A
single-language search is the documented way this goes wrong: a 2026-07-19 audit declared "the book
never mentions History 链表" after searching only history list, while the book used the Chinese form
four times. The cost is asymmetric — a missed finding leaves one clause unfixed, but a false finding
triggers a rewrite of a correct page, and every rewrite is a fresh chance to introduce an error.
Normalize five PDF extraction deformations before you conclude a term is absent. A page's word can be
verbatim in the source yet fail a naive string search because the extracted source.md mangled it. The
2026-07-21 llm-fundamentals audit hit the first three at once (20 false "not in source" candidates),
then the full page-by-page read surfaced two more — each of which, if believed, would have rewritten a
correct page. Apply all five before the search, not after:
- Ligatures — the PDF stores
ffi/ff/fi/fl(single code points, e.g. U+FB03) soEfficiencyisEfficiency,Parameter-EfficientisParameter-Efficient. Expand ligatures to their ASCII letters. - Line-break hyphenation — a word split across a line break keeps its hyphen:
AccuratelybecomesAc-⏎curately,PrefixesbecomesPre-⏎fixes. Rejoin-⏎ before searching. - CJK–Latin spacing — the extractor inserts a space between CJK and Latin runs, so
Encoder-only架构is stored asEncoder-only 架构. Collapse all whitespace (this also covers the plain Chinese/English/abbreviation/case/hyphen variants above). - Thousands separator — the page writes
1000but the source prints the grouped form1,000(ROME's "1000 条知识" is1,000in the source). Strip,from digit runs before matching numbers. - Chinese numerals — the page writes an Arabic digit but the source uses the Chinese numeral
(T5's "连续 3 个" is
连续三个in the source). Try the 一/二/三… form of any small integer.
Record the normalized form you searched, not just the raw term.
A sampling PASS is not a clean bill for the page. When you spot-check assertions rather than reading the page whole, the verdict covers only the assertions actually sampled — say so in the report, and later rounds must never inherit it as evidence that the page is clean. Three consecutive rounds on one source overturned pages that an earlier sampling round had marked clean; only an integral, per-assertion pass supports a page-level conclusion.
8. Failure stops / recovery
vault/index missing; scope unclear; the request is really a semantic-health check (switch to
wiki-lint-semantic); deterministic lint already failed with no stable QA scope; an evidence path is
missing; the user asks to edit content pages directly (switch to kb-review and wait for confirmation).
Recovery: the report + proposals are the durable output; re-run after the scope is clarified.
9. Acceptance criteria
- The QA report is written under
pipeline-workspace/reports/kb-qa/. - Every Q-chain item has a question, evidence, judgement, and a follow-up action.
- Actionable findings are written as Review-Queue proposals.
- No wiki content page was edited directly.
- None of
wiki-lint-semantic's exclusive triggers were handled.