From harness-claude
Orchestrates pipeline of 4 skills to check documentation drift, coverage gaps, links, and freshness with convergence-based fixes, producing health report. Use post-refactor, periodic hygiene, or onboarding.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Orchestrator composing 4 documentation skills into a sequential pipeline with convergence-based remediation, producing a qualitative documentation health report.
Guides documentation management in nexus-agents repo: updating/adding docs, changing pipelines, troubleshooting issues. Auto-triggers on 'update docs', 'add documentation', 'doc pipeline'.
Validates AGENTS.md quality and evolves it as codebase changes, ensuring AI agents have accurate project context. Use after file additions, renames, API changes, or periodically.
Audits project docs for staleness, gaps, and misorganization using python scripts and haiku agents. Remediates via specialized agents with quality gate. Use after features, refactors, upgrades, or periodically.
Share bugs, ideas, or general feedback.
Orchestrator composing 4 documentation skills into a sequential pipeline with convergence-based remediation, producing a qualitative documentation health report.
on_doc_check triggers fire| Skill | Pipeline Phase | Role |
|---|---|---|
| detect-doc-drift | DETECT | Find drift between code and docs |
| align-documentation | FIX | Apply fixes for drift findings |
| validate-context-engineering | AUDIT | Find gaps in documentation coverage |
| harness-knowledge-mapper | FILL | Generate/regenerate AGENTS.md and fill gaps |
This orchestrator delegates to sub-skills — it never reimplements their logic. Each sub-skill retains full standalone functionality.
The pipeline delegates, never reimplements. If you find yourself writing drift detection logic, fix application logic, or gap analysis logic inside the pipeline, STOP. Delegate to the dedicated sub-skill.
Safe fixes are silent, unsafe fixes surface. Never apply a fix classified as unsafe without explicit user approval. Never prompt the user for a fix classified as safe.
| Flag | Effect |
|---|---|
--fix | Enable convergence-based auto-fix (default: detect + report only) |
--no-freshen | Skip graph staleness check |
--bootstrap | Force AGENTS.md regeneration even if one exists |
--ci | Non-interactive: apply safe fixes only, report everything else |
All phases read from and write to a shared DocPipelineContext:
interface DocPipelineContext {
// Pipeline state
graphAvailable: boolean;
agentsMdExists: boolean;
bootstrapped: boolean; // true if AGENTS.md was created this run
// Phase outputs
driftFindings: DriftFinding[];
fixesApplied: DocFix[];
gapFindings: GapFinding[];
fillsApplied: DocFix[];
exclusions: Set<string>; // finding IDs already addressed
// Health verdict
verdict: 'pass' | 'warn' | 'fail';
summary: string;
}
interface DriftFinding {
id: string;
file: string;
line?: number;
driftType: 'renamed' | 'new-code' | 'deleted-code' | 'changed-behavior' | 'moved-code';
priority: 'critical' | 'high' | 'medium' | 'low';
staleText: string;
codeChange: string;
suggestedFix: string;
fixSafety: 'safe' | 'probably-safe' | 'unsafe';
}
interface GapFinding {
id: string;
file?: string;
gapType: 'undocumented' | 'broken-link' | 'stale-section' | 'missing-context';
priority: 'critical' | 'high' | 'medium' | 'low';
description: string;
suggestedFix: string;
fixSafety: 'safe' | 'probably-safe' | 'unsafe';
}
interface DocFix {
findingId: string;
file: string;
oldText: string;
newText: string;
safety: 'safe' | 'probably-safe';
verified: boolean; // harness check-docs passed after applying
}
The context is passed to sub-skills via handoff.json with a pipeline field. Sub-skills check for this field; if absent, they run in standalone mode.
Skip this phase if --no-freshen flag is set.
Check graph existence. Look for .harness/graph/ directory.
context.graphAvailable = truecontext.graphAvailable = false, log notice: "No knowledge graph available. Pipeline will use static analysis fallbacks. Run harness scan for richer results."Check graph staleness (only if graph exists).
git rev-list --count HEAD ^$(cat .harness/graph/.last-scan-commit 2>/dev/null || echo HEAD)harness scan to refreshCheck AGENTS.md existence.
--bootstrap not set: set context.agentsMdExists = true, proceed to DETECT--bootstrap set: proceed to step 4 (regenerate)Bootstrap AGENTS.md.
If graph available:
harness-knowledge-mapper to generate AGENTS.mdcontext.bootstrapped = truecontext.agentsMdExists = trueIf no graph (directory structure fallback):
Glob source directories: src/*/, packages/*/, lib/*/
Read package.json for project name and description
Identify entry points: files matching src/index.*, main field in package.json
List top-level modules: each immediate subdirectory of src/ (or packages/) with its directory name as the module name
Generate minimal AGENTS.md:
# AGENTS.md
> Generated from directory structure. Run `harness scan` for richer output.
## Project
<name from package.json> — <description from package.json>
## Entry Points
- <each identified entry point>
## Modules
- **<dir-name>/** — <inferred from directory name>
Set context.bootstrapped = true
Set context.agentsMdExists = true
Proceed to DETECT phase.
Write pipeline context to handoff.json. Set the pipeline field in .harness/handoff.json with the current DocPipelineContext so detect-doc-drift can read it.
Invoke detect-doc-drift. Run the skill's full process:
harness check-docs and harness cleanup --type driftPopulate context with DriftFinding objects. For each finding from detect-doc-drift, create a DriftFinding with:
id: deterministic hash of file + line + driftType (for dedup tracking)driftType: map to one of renamed, new-code, deleted-code, changed-behavior, moved-codepriority: map to critical, high, medium, lowfixSafety: classify using the safety table belowStore findings. Set context.driftFindings = <all DriftFinding objects>.
If --fix flag is not set: Skip to AUDIT phase (Phase 4).
| Category | Safe (apply silently) | Probably safe (present diff) | Unsafe (surface to user) |
|---|---|---|---|
| Drift fixes | Update file path where rename is unambiguous; fix import reference | Rewrite description for simple rename/parameter change; update code examples | Rewrite behavioral explanations; remove sections for deleted code |
| Gap fills | Add entry for new file with obvious single-purpose name | Add entry for new file requiring description; update AGENTS.md section ordering | Write documentation for complex modules; create new doc pages |
| Link fixes | Redirect broken link where target is unambiguous | Redirect when multiple candidates exist (present options) | Remove link when target no longer exists |
This phase runs only when --fix flag is set.
previousCount = context.driftFindings.length
maxIterations = 5
while iteration < maxIterations:
1. Partition findings by safety
2. Apply safe fixes → verify → record
3. Present probably-safe fixes → apply approved → verify → record
4. Surface unsafe fixes to user (no auto-apply)
5. Re-run detect-doc-drift
6. newCount = remaining findings
7. if newCount >= previousCount: STOP (converged)
8. previousCount = newCount
9. iteration++
Partition findings by fixSafety.
safeFixes: findings where fixSafety === 'safe'probablySafeFixes: findings where fixSafety === 'probably-safe'unsafeFixes: findings where fixSafety === 'unsafe'Apply safe fixes silently.
pipeline.fixBatch = safeFixesharness check-docs after the batchDocFix with verified: true in context.fixesAppliedgit checkout -- <files>), record fixes as verified: falsecontext.exclusionsPresent probably-safe fixes (skip in --ci mode).
harness check-docs after the batchcontext.exclusionsSurface unsafe fixes.
suggestedFix text--ci mode: log to report, do not promptRe-run detect-doc-drift to check for cascading issues revealed by fixes.
Record remaining unfixed findings for the REPORT phase.
Write pipeline context to handoff.json. Update the pipeline field with the current DocPipelineContext (including exclusions from FIX phase).
Invoke validate-context-engineering. Run the skill's full process:
harness validate and harness check-docsPopulate context with GapFinding objects. For each finding, create a GapFinding with:
id: deterministic hash of file + gapType + descriptiongapType: map to undocumented, broken-link, stale-section, missing-contextpriority: map to critical, high, medium, lowfixSafety: classify using the safety table from DETECT phaseDedup against FIX phase. Remove any GapFinding whose id appears in context.exclusions. This prevents double-counting items already fixed in the FIX phase.
Store findings. Set context.gapFindings = <deduplicated GapFinding objects>.
If --fix flag is not set: Skip to REPORT phase (Phase 6).
This phase runs only when --fix flag is set.
Check if AGENTS.md needs regeneration. If context.bootstrapped === true and gap findings include AGENTS.md coverage issues, invoke harness-knowledge-mapper (if graph available) or the directory-structure fallback to improve AGENTS.md quality.
Run convergence loop (same pattern as FIX phase):
previousCount = context.gapFindings.length
maxIterations = 5
while iteration < maxIterations:
1. Partition findings by safety
2. Apply safe fills → verify → record
3. Present probably-safe fills → apply approved → verify → record
4. Surface unsafe fills to user
5. Re-run validate-context-engineering
6. newCount = remaining gaps (after dedup against exclusions)
7. if newCount >= previousCount: STOP (converged)
8. previousCount = newCount
9. iteration++
Apply safe fills silently.
broken-link with unambiguous target: redirect the linkundocumented with obvious single-purpose name: add minimal entryharness check-docs after each batchcontext.fillsAppliedcontext.exclusionsPresent probably-safe fills (skip in --ci mode).
Surface unsafe fills.
Record remaining unfilled gaps for the REPORT phase.
Run final harness check-docs to establish the post-pipeline state.
Compute verdict.
FAIL if any of:
harness check-docs fails after all fix attemptsWARN if any of:
30% of source modules are undocumented
PASS if:
harness check-docs passesGenerate per-category breakdown:
| Category | Metric |
|---|---|
| Accuracy | Drift findings remaining (by priority) |
| Coverage | Undocumented modules remaining |
| Links | Broken references remaining |
| Freshness | Graph staleness status |
List actions taken:
Set context verdict and summary. Write context.verdict and context.summary.
Output report to console. Format:
=== Documentation Health Report ===
Verdict: PASS | WARN | FAIL
Accuracy: N drift findings remaining (0 critical, 0 high, N medium, N low)
Coverage: N/M modules documented (N%)
Links: N broken references remaining
Freshness: Graph current | Graph stale (N commits behind) | No graph
Actions:
- N safe fixes applied silently
- N probably-safe fixes applied (user-approved)
- N unsafe findings deferred to user
- AGENTS.md bootstrapped from <graph|directory structure>
Remaining findings:
[list of unfixed findings with priority and suggested action]
harness check-docs — Run in DETECT, after each fix batch in FIX/FILL, and in REPORT for final stateharness cleanup --type drift — Used by detect-doc-drift during DETECT phaseharness scan — Used in FRESHEN to refresh stale graphharness validate — Run as final step in each task to verify project healthharness-docs-pipeline runs all 4 sub-skills in the right order with shared contextharness check-docs runs after every fix batch; failed fixes are revertedThese are common rationalizations that sound reasonable but lead to incorrect results. When you catch yourself thinking any of these, stop and follow the documented process instead.
| Rationalization | Why It Is Wrong |
|---|---|
| "The drift finding is marked unsafe but the fix is obvious, so I will apply it silently" | Never apply a fix classified as unsafe without explicit user approval. The Iron Law: safe fixes are silent, unsafe fixes surface. |
| "The convergence loop reduced findings from 8 to 6, but the remaining ones are hard -- I will keep iterating" | If a convergence iteration does not reduce the finding count, stop immediately. Continuing without progress wastes iterations. |
| "I can write the drift detection logic directly instead of delegating to detect-doc-drift" | The pipeline delegates, never reimplements. Each sub-skill retains full standalone functionality. |
| "The graph is not available so the pipeline results will be unreliable" | The entire pipeline runs without a graph using static analysis fallbacks. Reduced accuracy is noted in the report, not used as an excuse to skip. |
Input: --fix flag set, graph available, AGENTS.md exists
1. FRESHEN — Graph exists, 3 commits behind (< 10, skip refresh)
AGENTS.md exists, no bootstrap needed
2. DETECT — detect-doc-drift found 8 findings:
2 critical (deleted file still referenced)
3 high (renamed functions)
2 medium (stale descriptions)
1 low (formatting)
3. FIX — Iteration 1:
3 safe fixes applied (renamed file paths)
2 probably-safe presented, 2 approved
2 unsafe surfaced to user
harness check-docs: pass
Re-detect: 1 new finding (cascading rename)
Iteration 2:
1 safe fix applied
Re-detect: 0 new findings — converged
4. AUDIT — validate-context-engineering found 5 gaps
2 already in exclusions (fixed in FIX) → 3 remaining
5. FILL — 1 safe fill (broken link redirect)
1 probably-safe (new module entry) → approved
1 unsafe (complex module docs) → deferred
Re-audit: converged
6. REPORT — Verdict: WARN
Accuracy: 2 drift findings remaining (0 critical, 0 high, 1 medium, 1 low)
Coverage: 12/14 modules documented (86%)
Links: 0 broken references
Freshness: Graph current
Input: --fix --ci flags set, no graph
1. FRESHEN — No graph (notice logged), AGENTS.md exists
2. DETECT — 4 findings (1 critical, 2 high, 1 medium)
3. FIX — 2 safe fixes applied silently
probably-safe and unsafe: logged to report (no prompts)
4. AUDIT — 2 gaps (1 deduped) → 1 remaining
5. FILL — 0 safe fills, 1 probably-safe logged to report
6. REPORT — Verdict: FAIL (1 critical finding remains)
Input: --bootstrap flag set, no graph, no AGENTS.md
1. FRESHEN — No graph, no AGENTS.md
Fallback bootstrap: glob src/*, read package.json
Generated minimal AGENTS.md (32 lines)
context.bootstrapped = true
2. DETECT — 0 drift findings (fresh AGENTS.md, no stale refs)
3. AUDIT — 6 gaps (4 undocumented modules, 2 missing context)
4. REPORT — Verdict: WARN (>30% modules undocumented, no graph)
harness check-docs. If check fails, revert the batch.unsafe are never applied without explicit user approval. In --ci mode, they are logged but never applied.harness scan and accept the reduced quality for the current run.harness check-docs is unavailable: Fall back to file existence checks and link validation via grep. Log a notice about reduced verification accuracy.