Files
command-center/agent/managed-skills/docs-dedupe-verify-campaign/SKILL.md
T

3.8 KiB

name, description
name description
docs-dedupe-verify-campaign Run an exhaustive docs dedupe + fact-verification campaign in dank/command-center: scout cluster ledgers, evidence-overridden merges, live fleet probes, log compaction law, and landing via Gitea PR.

Campaign procedure for deduping + fact-checking omp-docs/ in dank/command-center (proven on Refs #29, 2026-10-19: 8 commits, -2,229 lines, 0 lint/coverage/bats failures).

1. Recon

  • Fresh branch off origin/main in a new worktree (git worktree add ~/.omp/wt/<name> -b docs/<issue>-<slug> origin/main); the session worktree's git checkout -b is policy-blocked.
  • Run scripts/kb-lint.sh omp-docs baseline; write a throwaway index-coverage checker (each dir's index.md must link every subdir/file) — mechanical, no scout needed.
  • Open the Gitea issue first (multi-moving-parts law).

2. Scout fan-out (overlap detection)

  • One task batch, agent: scout, one task per doc cluster + one cross-cutting sweep (cap 2 concurrent; rest queue).
  • Each scout writes a ledger to local://dedupe/<cluster>.md: inventory table (file, lines, purpose, verdict KEEP/MERGE/DELETE/UPDATE), overlaps, facts-to-keep ledger, inbound links, staleness, claims-needing-verification.
  • Scouts are LEADS, not truth. Observed failures: fabricated ledger entries (claims about text that does not exist in any file), a DELETE verdict on a generated artifact that is under test (tools/niri/keybindings.md is generated by scripts/gen-keybinds.sh and tested by tests/gen-keybinds.bats — keep), and a KEEP based on misreading a changelog leftover. Re-derive every consequential verdict from the files/repo yourself.

3. Verify fleet facts live (never trust doc dates)

  • Read-only BatchMode probes: ssh -o BatchMode=yes dankclaw '...' (podman ps/inspect, systemctl status, curl localhost, os-release, cpuinfo). sudo -n only has systemctl verbs — use podman exec <ctr> grep/cat for in-container files.
  • Update docs with dated drift banners ("probed 2026-10-19") for policy divergence; NEVER silently re-apply a policy — flag as operator decision (e.g. SearXNG engine policy).

4. Verify external claims via direct web research (no subagents)

  • Version/protocol/benchmark claims: primary source only (upstream README, raw.githubusercontent, /api/v1/version, arxiv). If a number cannot be re-attributed to a published benchmark, drop it with an explicit note in the doc.
  • Fabrication hunt: invented distros/projects/model names (found: "FreeToken" distro, ornith-llama-cpp-setup tree, Intel CPU on an AMD box) — delete the artifact, not just the line.

5. Log compaction law

  • Changelog entry = date + what changed + durable lesson + concept-page pointer, few lines. Full narratives live in git (git log --follow). Record the law at the top of log.md. Never re-expand an entry in place. Keep pi-era entries tagged "(pi era)".

6. Gates + landing

  • Gate every commit: bash scripts/kb-lint.sh omp-docs + index-coverage + bats tests/ (67 tests). Pre-commit hook prints error: command not found: caddy on Caddyfile-touching commits — warning only, commit still lands.
  • Gitea API auth: ~/.config/secrets/gitea is URL-form (http://dank:<token>@host), not a raw token. Extract: T=$(sed -n 's|.*://[^:]*:\([^@]*\)@.*|\1|p' ~/.config/secrets/gitea | head -1); raw cat as bearer token → 401.
  • PR body ends with --- + cwd: <wd> · session: <id> footer; then xdg-open <PR-URL> immediately; comment the campaign ledger summary on the issue. NEVER merge without Frank's explicit OK.

Edit-tool field notes (recurring traps)

  • PUT N+=: is invalid syntax — it inserts the literal text. One insert-op per edit call; recompute line numbers per call.
  • File hash tag changes after every edit — re-read before each subsequent edit call to the same file; reusing a stale tag is rejected.