wiki-lint は何をしますか?
初回実行前に、キット内の
docs/GOTCHAS.md(既知の誤検出、動作上の注意)をお読みください。
ウィキ(wiki_root in wiki.config.json)の読み取り専用ヘルススキャンと3つの修復ツールです。すべてPython標準ライブラリで構成され、Windows、macOS、Linuxで同一動作します。ウィキ固有のルール(フォルダ、ステータス分類、フィールドマップ、除外リスト、動詞リスト、プレースホルダーパターン、しきい値)はすべて設定ファイルに記述されているため、ウィキに新しいフィールド、フォルダ、チェックが追加されてもロジックは変更されません。3,000ノートを超えても高速に動作するよう設計されています(フル実行は数秒ですが、チェック13はその規模で約30秒かかります)。
関連スキル
wiki-ingest,wiki-ingest-book: このスキルがチェックするノートを作成します(ステータス判断とインデックスルーティングに同じ設定を使用)。wiki-synthesize: チェック15がワークリストを作成し、チェック32がそのシールを監査します。vocabulary-update: チェック30の修正手段です。
レイアウト
skills/wiki-lint/
SKILL.md
scripts/
lint.py # チェックの実行(--only, --out-dir, --self-test)
fix.py # 修復ツール:インデックス提案、チェック12のバックリンク、下書き昇格
references/
check-origins.md # 各チェックの存在理由(単一の権威)
cli-reference.md # フラグ、設定キー、出力ファイル、レポート形式
wikikit/lint/ # 実装:context.py, checks_*.py, fixes.py, defaults.json
tests/fixtures/lint/ # すべてのチェックを実行する合成ミニウィキ + expected_counters.txt
各事実が存在する場所(これら間で重複しないこと):references/check-origins.md = チェックの存在理由;このファイル = 何をするか;wikikit/lint/checks_*.py = どのように実装されているか;tests/fixtures/lint/expected_counters.txt = フィクスチャ値がその値である理由。ライブ実行の最後に、ツールは発火したすべてのチェックの check-origins.md のポインターを出力するため、ヒットが本物かノイズかを判断する際に根拠が得られます。
エンジニアリング不変条件(破らないこと)
- すべてのファイルI/Oは
wikikit.textioを経由する(バイトレベルのUTF-8、BOMなし、行末変換なし)。テキストモードのopen()をデフォルトの改行処理で使用しないでください:CRLFファイルを読み書きすると、暗黙的に変換されます。 - CRLFを含む可能性のあるテキストに対してマルチライン正規表現で
$を使用しないこと:$はCRとLFの間に位置し、ペアを分割します。行ごとに編集してください(frontmatter.set_key,fixes._insert_backlinks)。 - 設定が唯一の真実の情報源です。 ウィキにフィールド、フォルダ、ステータス、除外が追加された場合は、コードではなく
wiki.config.json(lintセクション)を編集してください。デフォルト値はwikikit/lint/defaults.jsonにあります。 - スタブの除外は統一されています。
lint.stub_exempt_checksにはstatus: stubのノートをスキップするチェック番号がリストされています。設定からリストを読み取り、散文で再記述しないでください。チェック10と11はスタブをインラインで除外します(ファイルシステムカウント)。 - プレースホルダー検出は未解決を条件としています。 ボールトインデックスで解決されるウィキリンクターゲットは、その名前がパターンに一致してもプレースホルダーとしてフラグされません。正当なALL-CAPS略語ノートはフラグされてはなりません。
- ロジック変更の前に自己テストを行ってください。 チェックへの編集(新しいチェック、しきい値変更、ヒューリスティックのリファクタリング)は、
python skills/wiki-lint/scripts/lint.py --self-testがグリーンで通過しなければなりません。変更が意図的である場合は、tests/fixtures/lint/とexpected_counters.txtを一緒に更新してください。フィクスチャが識別することを証明してください:ロジック変更を元に戻し、再実行し、カウンターが変動することを確認してください。変更前後の両方でパスするフィクスチャは何も保護しません。 - ゼロは検出器の測定値であり、ウィキの測定値ではありません。 新しいチェックのゼロを信頼する前に、ポジティブケースを注入して発火することを確認してください。
- 警告マーカーの所有権は位置的であり、正規表現チェーンではありません(チェック22)。 ウィキは
[[Paper]]⚠と⚠[[Paper]]の両方を使用する可能性があります。グリフの所有者は、左トリムされたテキストが]]で終わる場合はそのすぐ左のリンク、そうでない場合は右のリンクです。リンクに隣接しないグリフは散文の注意喚起です。2つのチェーンされた正規表現でこれを解決しないでください(2番目が隣のリンクのマーカーを消費し、未検証のソースを静かにデフラグします)。マーカーの一括編集には、変更前後の引用キーごとの国勢調査が必要です。
チェックの動作方法
| # | 名前 | フラグする内容 | 除外 |
|---|---|---|---|
| 1 | 孤立した概念 | 論文/書籍からのバックリンクがゼロ(インラインリンクまたはconcepts_touched)かつ兄弟概念からのバックリンクもゼロ(インラインまたはrelated_concepts)。兄弟レグにより合成ハブからの誤検出を防止 | stub |
| 2 | 孤立した手法 | 論文/書籍からのバックリンクがゼロかつ論文/書籍への発信リンクもゼロ | stub |
| 3 | 空のconcepts_touched | フィールドがnull、空、または[]の論文ノート(バッチ取り込みでのフロントマター破損のカナリアでもある) | stub |
| 4 | 出典なしの主張 | 主張動詞(verb_list)を含む行が少なくともunsourced_threshold行あり、かつその半径unsourced_radius内またはウィキリンクされた見出し下にウィキリンクがない概念ノート | stub |
| 5 | 壊れた/プレースホルダーのウィキリンク | ボールト全体のインデックスにないターゲット(broken)、または非解決時にplaceholder_wikilink_patternsに一致するもの(placeholder)、または空([[]], empty-target) | link_target_ignore_patterns(Bases埋め込み) |
| 6 | 下書き | promote:少なくともmin_distinct_sources_for_final個の異なるソース作品を引用する下書き(書籍とその章は1作品としてカウント)。stale:そのしきい値未満でstale_daysより古い下書き、または日付なし | なし |
| 7 | インデックスカバレッジ | ベースネームがindex.md内のウィキリンックでないノート | stub;index_modeがbasesの場合はスキップ |
| 7b | インデックスセクションの誤配置 | - [[X]] が誤った##セクション(index_sections)の下にある | basesモードではスキップ |
| 8 | 書籍chapters_ingestedの同期 | 宣言されたセットがディスク上の{book}_ChNN.mdファイルと異なる | stub章 |
| 9 | book:のない章 | book:リンクが欠落しているか解決しない*_ChNNノート | なし |
| 10 | Quick Statsのずれ | ## Quick Statsで宣言された数値が、対応するフォルダのライブファイル数(quick_stats_labels)と異なる | なし |
| 11 | Coverage by Fieldのずれ | ## Coverage by Fieldの概念/手法列が、ライブの非スタブカウント(フィールド行はfield:、->サブフィールド行は[[MOC_*]]リンクに基づくsubfield:キー)と異なる;ノートがあるが行がないサブフィールドはMISSING-ROW | stub;フィールドなしノートはINFO |
| 12 | 双方向concepts_touched | paper -> concepts_touched[token] のターゲットに[[paper]]バックリンクがない(asymmetry、自動修正可能)またはノートに解決しない(missing_target、トークンをトリアージ) | なし |
| 13 | リンクのない別名 | 別の概念/手法の散文で使用されている文書化された別名(特徴的な頭字語または複数単語のフレーズ)で、正規のノートへのリンクがない。INFO | stub;alias_link_stoplist;引用ブロックは検索しない |
| 14 | 言語レーダー | ウィキの言語以外の見出し(H2-H6)、または散文内で少なくともprose_threshold個のストップワードヒット。報告のみ;language_radar.enabledが無効な場合は無効 | stub |
| 15 | 合成レーダー | final概念/手法に適用:missing = State-of-Knowledgeブロックの対象だが存在しない;stale = ブロックが引用作品の最新last_verifiedより古い | 非final |
| 16 | ステータス語彙 | status が status_by_type[type] にない、status または type が欠落、またはテンプレート漏れ(draft | final) | なし |
| 17 | source_verificationなし | シールのない論文;abstractで始まる値はシールではない。INFOバックログ | stub |
| 18 | 検証済みだが不完全 | シールされた論文で、volumeまたはpagesが欠落しており、日付付きcheck18_exempt: "YYYY-MM-DD, reason"がないもの;会議論文と学位論文は会場と形式により免除 | stub |
| 19 | evidence_levelが語彙外 | 値がevidence_level_vocabにない(論文のみ) | なし |
| 20 | 有用な引用]] | ## Useful Quotesの下の引用ブロックに漏れた]]がある | なし |
| 21 | 全文以前のコホート | synthesis.prefulltext_cutoffより前の日付の論文で、全文レベルのシールがない。INFO | stub |
| 22 | 古い全文以前マーカー | 所有ウィキリンクが既に全文シールを持つ論文である⚠が、3つの末尾除外(散文注釈、日付付きイタリック注釈、(N src信頼度)後も残っている。実際の誤検出あり | なし |
| 23 | 未記入の主張プレースホルダー | unfilled_claim_patternsに一致する行(ソースは名前が挙がっているが主張が書かれていない) | なし |
| 24 | 非推奨フロントマターキー | deprecated_frontmatter_keys(デフォルトではjournalからvenue)のキー;完全一致のため誤検出なし | なし |
| 25 | 引用なしの統計値 | 統計値(numeric_claim_patterns)で、半径内にウィキリンクがなく、cited/block/methods/domainに分類されるもの。INFO。何も除外されない | stub;引用ブロックはスキップ |
| 26 | テーブル列不一致 | 行のセル数が区切り行と異なるテーブル(唯一の構造チェック) | なし |
| 27 | 文字化け | encode('cp1252').decode('utf-8') のラウンドトリップで異なる文字列になる行 | なし |
| 28 | last_verifiedなしのシール | source_verificationがありlast_verifiedがない論文/書籍(チェック15のstaleからは見えない)。INFO | なし |
| 29 | ボールト外スラッグリンク | memory_slug_prefixesのスラッグへのウィキリンク(ボールト全体)。リストが空でない場合のみ有効 | memory_slug_exempt_files |
| 30 | 語彙同期 | _VOCABULARY.mdにライブの概念/手法がない(missing)か、存在しないノートの行がある(ghost)。INFO;修正は/vocabulary-update | なし |
| 31 | テキストなしのシール | 最大60文字で、どのチャンネルにも説明検証テキストがないシール。INFO | なし |
| 32 | シールのないペア | (ノート、そのState-of-Knowledgeブロックで引用された作品)ペアで、ソースノートのシールがノートを名前で指定していない。ブロック;seal_debt_fileで宣言された負債は報告されるがカウントされない | 宣言された負債 |
| 33 | タイトルまたは会場なし | titleまたはvenueが空の論文 | stub |
呼び出し方法
ボールトから(上方向に最も近い wiki.config.json が設定です):
python skills/wiki-lint/scripts/lint.py # すべてのチェック;リストは_temp/に出力
python skills/wiki-lint/scripts/lint.py --only 5,12 # 選択されたチェック
python skills/wiki-lint/scripts/lint.py --self-test # フィクスチャ vs expected_counters.txt
python skills/wiki-lint/scripts/fix.py check12 --dry-run
python skills/wiki-lint/scripts/fix.py promote _temp/promote_batch.txt
python skills/wiki-lint/scripts/fix.py index # index_mode "manual" と事前のlint実行が必要
フラグ、設定キー、各チェックの出力ファイル:references/cli-reference.md。
何をいつ編集するか
- 新しいウィキフォルダ(例:
datasets/):wiki.config.jsonのfoldersに追加します。ノートが作成される前に登録する必要があります。登録されていないと、そのフォルダへのリンクはすべて壊れたものとして扱われます。 - 新しいステータス値:
lint.status_by_type.{type}に追加します。新しいノートタイプ:許可されるステータスとともにタイプを追加します。 - 概念/手法の新しいフィールド:スラッグを
field_titlecase_mapに追加します。 - チェック4の調整:
lint.verb_list。許容範囲の緩和/厳格化:lint.defaults.unsourced_radius。 - 新しいプレースホルダーパターン:
lint.placeholder_wikilink_patterns(非解決ターゲットにのみ適用されることに注意)。 - チェックがスタブをスキップする必要がある場合:その番号を
lint.stub_exempt_checksに追加します。 - 言語レーダーの有効化:
examples/languages/es.json(または独自のリスト)をlint.language_radarにコピーします。 - 新しいチェックの追加:
wikikit/lint/checks_*.pyに実装し、カウンターをexpected_counters.txtに追加し、それを実行するフィクスチャを追加し、そのエントリをreferences/check-origins.mdに記述します。動機が文書化されていないチェックは、最初にノイズのように見えたときに無効化されます。動機を特定できない場合は、「not documented」と記述します。決して作り出さないでください。
安全規則
- lintはウィキに対して読み取り専用です。チェックごとのリストを
--out-dir(デフォルト_temp/)に書き込むだけです。 fix.pyは報告した場所(バックリンク、ステータス)でのみノートを変更し、各ファイルの行末を保持し、すべての変更をロールバック用にログに記録します。- ヒューリスティックの変更が正しいかどうかわからない場合は、最初にフィクスチャを記述し、自己テストが失敗するのを確認してから変更を行ってください。
- キャッシュディレクトリはバージョン管理されません(
_temp/などは.gitignoreに残します)。バージョン管理された測定値は、数か月後に今日のものとして読まれます。