@harness-engineering/cli 2.6.1 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skills/claude-code/align-design-system/SKILL.md +174 -0
- package/dist/agents/skills/claude-code/align-design-system/skill.yaml +57 -0
- package/dist/agents/skills/claude-code/audit-brand-compliance/SKILL.md +189 -0
- package/dist/agents/skills/claude-code/audit-brand-compliance/skill.yaml +50 -0
- package/dist/agents/skills/claude-code/audit-component-anatomy/SKILL.md +181 -0
- package/dist/agents/skills/claude-code/audit-component-anatomy/skill.yaml +51 -0
- package/dist/agents/skills/claude-code/copy-craft/SKILL.md +192 -0
- package/dist/agents/skills/claude-code/copy-craft/skill.yaml +52 -0
- package/dist/agents/skills/claude-code/detect-design-drift/SKILL.md +139 -0
- package/dist/agents/skills/claude-code/detect-design-drift/skill.yaml +50 -0
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +10 -0
- package/dist/agents/skills/claude-code/harness-design-craft/SKILL.md +212 -0
- package/dist/agents/skills/claude-code/harness-design-craft/skill.yaml +57 -0
- package/dist/agents/skills/claude-code/harness-design-pipeline/SKILL.md +266 -0
- package/dist/agents/skills/claude-code/harness-design-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/claude-code/knowledge-craft/SKILL.md +180 -0
- package/dist/agents/skills/claude-code/knowledge-craft/skill.yaml +49 -0
- package/dist/agents/skills/claude-code/naming-craft/SKILL.md +244 -0
- package/dist/agents/skills/claude-code/naming-craft/skill.yaml +51 -0
- package/dist/agents/skills/claude-code/security-craft/SKILL.md +205 -0
- package/dist/agents/skills/claude-code/security-craft/skill.yaml +58 -0
- package/dist/agents/skills/claude-code/spec-craft/SKILL.md +184 -0
- package/dist/agents/skills/claude-code/spec-craft/skill.yaml +55 -0
- package/dist/agents/skills/claude-code/test-craft/SKILL.md +212 -0
- package/dist/agents/skills/claude-code/test-craft/skill.yaml +58 -0
- package/dist/agents/skills/codex/align-design-system/SKILL.md +174 -0
- package/dist/agents/skills/codex/align-design-system/skill.yaml +57 -0
- package/dist/agents/skills/codex/audit-brand-compliance/SKILL.md +189 -0
- package/dist/agents/skills/codex/audit-brand-compliance/skill.yaml +50 -0
- package/dist/agents/skills/codex/audit-component-anatomy/SKILL.md +181 -0
- package/dist/agents/skills/codex/audit-component-anatomy/skill.yaml +51 -0
- package/dist/agents/skills/codex/copy-craft/SKILL.md +192 -0
- package/dist/agents/skills/codex/copy-craft/skill.yaml +52 -0
- package/dist/agents/skills/codex/detect-design-drift/SKILL.md +139 -0
- package/dist/agents/skills/codex/detect-design-drift/skill.yaml +50 -0
- package/dist/agents/skills/codex/harness-accessibility/SKILL.md +10 -0
- package/dist/agents/skills/codex/harness-design-craft/SKILL.md +212 -0
- package/dist/agents/skills/codex/harness-design-craft/skill.yaml +57 -0
- package/dist/agents/skills/codex/harness-design-pipeline/SKILL.md +266 -0
- package/dist/agents/skills/codex/harness-design-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/codex/knowledge-craft/SKILL.md +180 -0
- package/dist/agents/skills/codex/knowledge-craft/skill.yaml +49 -0
- package/dist/agents/skills/codex/naming-craft/SKILL.md +244 -0
- package/dist/agents/skills/codex/naming-craft/skill.yaml +51 -0
- package/dist/agents/skills/codex/security-craft/SKILL.md +205 -0
- package/dist/agents/skills/codex/security-craft/skill.yaml +58 -0
- package/dist/agents/skills/codex/spec-craft/SKILL.md +184 -0
- package/dist/agents/skills/codex/spec-craft/skill.yaml +55 -0
- package/dist/agents/skills/codex/test-craft/SKILL.md +212 -0
- package/dist/agents/skills/codex/test-craft/skill.yaml +58 -0
- package/dist/agents/skills/cursor/align-design-system/SKILL.md +174 -0
- package/dist/agents/skills/cursor/align-design-system/skill.yaml +57 -0
- package/dist/agents/skills/cursor/audit-brand-compliance/SKILL.md +189 -0
- package/dist/agents/skills/cursor/audit-brand-compliance/skill.yaml +50 -0
- package/dist/agents/skills/cursor/audit-component-anatomy/SKILL.md +181 -0
- package/dist/agents/skills/cursor/audit-component-anatomy/skill.yaml +51 -0
- package/dist/agents/skills/cursor/copy-craft/SKILL.md +192 -0
- package/dist/agents/skills/cursor/copy-craft/skill.yaml +52 -0
- package/dist/agents/skills/cursor/detect-design-drift/SKILL.md +139 -0
- package/dist/agents/skills/cursor/detect-design-drift/skill.yaml +50 -0
- package/dist/agents/skills/cursor/harness-accessibility/SKILL.md +10 -0
- package/dist/agents/skills/cursor/harness-design-craft/SKILL.md +212 -0
- package/dist/agents/skills/cursor/harness-design-craft/skill.yaml +57 -0
- package/dist/agents/skills/cursor/harness-design-pipeline/SKILL.md +266 -0
- package/dist/agents/skills/cursor/harness-design-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/cursor/knowledge-craft/SKILL.md +180 -0
- package/dist/agents/skills/cursor/knowledge-craft/skill.yaml +49 -0
- package/dist/agents/skills/cursor/naming-craft/SKILL.md +244 -0
- package/dist/agents/skills/cursor/naming-craft/skill.yaml +51 -0
- package/dist/agents/skills/cursor/security-craft/SKILL.md +205 -0
- package/dist/agents/skills/cursor/security-craft/skill.yaml +58 -0
- package/dist/agents/skills/cursor/spec-craft/SKILL.md +184 -0
- package/dist/agents/skills/cursor/spec-craft/skill.yaml +55 -0
- package/dist/agents/skills/cursor/test-craft/SKILL.md +212 -0
- package/dist/agents/skills/cursor/test-craft/skill.yaml +58 -0
- package/dist/agents/skills/gemini-cli/align-design-system/SKILL.md +174 -0
- package/dist/agents/skills/gemini-cli/align-design-system/skill.yaml +57 -0
- package/dist/agents/skills/gemini-cli/audit-brand-compliance/SKILL.md +189 -0
- package/dist/agents/skills/gemini-cli/audit-brand-compliance/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/audit-component-anatomy/SKILL.md +181 -0
- package/dist/agents/skills/gemini-cli/audit-component-anatomy/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/copy-craft/SKILL.md +192 -0
- package/dist/agents/skills/gemini-cli/copy-craft/skill.yaml +52 -0
- package/dist/agents/skills/gemini-cli/detect-design-drift/SKILL.md +139 -0
- package/dist/agents/skills/gemini-cli/detect-design-drift/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +10 -0
- package/dist/agents/skills/gemini-cli/harness-design-craft/SKILL.md +212 -0
- package/dist/agents/skills/gemini-cli/harness-design-craft/skill.yaml +57 -0
- package/dist/agents/skills/gemini-cli/harness-design-pipeline/SKILL.md +266 -0
- package/dist/agents/skills/gemini-cli/harness-design-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/gemini-cli/knowledge-craft/SKILL.md +180 -0
- package/dist/agents/skills/gemini-cli/knowledge-craft/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/naming-craft/SKILL.md +244 -0
- package/dist/agents/skills/gemini-cli/naming-craft/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/security-craft/SKILL.md +205 -0
- package/dist/agents/skills/gemini-cli/security-craft/skill.yaml +58 -0
- package/dist/agents/skills/gemini-cli/spec-craft/SKILL.md +184 -0
- package/dist/agents/skills/gemini-cli/spec-craft/skill.yaml +55 -0
- package/dist/agents/skills/gemini-cli/test-craft/SKILL.md +212 -0
- package/dist/agents/skills/gemini-cli/test-craft/skill.yaml +58 -0
- package/dist/{agents-md-2JUQ4FE2.js → agents-md-FKMKH6ZF.js} +4 -4
- package/dist/{analyzer-VY6DJVOU-4AHIJLNS.js → analyzer-H3AHBFSL-KPOPJYRB.js} +8 -8
- package/dist/{architecture-CXAVNB5X.js → architecture-LUR2I67H.js} +6 -6
- package/dist/{assess-project-M626SSPN.js → assess-project-OJWECOP2.js} +2 -1
- package/dist/bin/harness-mcp.js +17 -17
- package/dist/bin/harness.js +27 -27
- package/dist/{check-phase-gate-XMU6LLUQ.js → check-phase-gate-HS5KYLRO.js} +5 -5
- package/dist/{chunk-5XLLIYYL.js → chunk-6UHDQP2N.js} +1 -1
- package/dist/{chunk-I6K43QQS.js → chunk-7AF6C5GE.js} +3 -3
- package/dist/{chunk-372MGNTI.js → chunk-7PLIWP7U.js} +6899 -133
- package/dist/{chunk-VUCGB2KH.js → chunk-B2VAYLYI.js} +1 -1
- package/dist/{chunk-HFOB2MPQ.js → chunk-CZPOPMMI.js} +3 -3
- package/dist/{chunk-43M3RLFQ.js → chunk-FC4JPM6W.js} +2 -2
- package/dist/{chunk-6AX6R3LM.js → chunk-FEKBXX2J.js} +9 -9
- package/dist/{chunk-VTTNIZJL.js → chunk-FXZI6NJ2.js} +131 -6
- package/dist/{chunk-5JNSFYZU.js → chunk-GGSNWH7P.js} +6 -6
- package/dist/{chunk-BCFDGOMA.js → chunk-H2ZJOJ7A.js} +81 -1
- package/dist/{chunk-PFZEADQM.js → chunk-INBTDBV2.js} +79 -2
- package/dist/{chunk-Q6ZR2L6Q.js → chunk-KN3EMDZ5.js} +2 -2
- package/dist/{chunk-JFZOWO7D.js → chunk-LECXPXS3.js} +1 -1
- package/dist/{chunk-CQOMVZDC.js → chunk-LGYXR2KZ.js} +2237 -604
- package/dist/{chunk-QOKMDDBJ.js → chunk-LYIPI2SJ.js} +6 -6
- package/dist/{chunk-L5BCZ5XS.js → chunk-N5NSSLMU.js} +1 -1
- package/dist/{chunk-GWE5LL3R.js → chunk-NIVWM7OW.js} +10 -10
- package/dist/{chunk-24KCOJJG.js → chunk-O2ASYKA6.js} +1 -1
- package/dist/{chunk-K246XQ2L.js → chunk-PTHX545Q.js} +1 -1
- package/dist/{chunk-EPUKTTJZ.js → chunk-RC3OI5NK.js} +5 -1
- package/dist/{chunk-YP7I25SL.js → chunk-RJ2WEES5.js} +1 -1
- package/dist/{chunk-5FDBXUFW.js → chunk-TIH53QXY.js} +1 -1
- package/dist/{chunk-OA6SWTU4.js → chunk-VI4IS55S.js} +11 -8
- package/dist/{chunk-GWF2OILZ.js → chunk-VSIRUZQP.js} +1 -1
- package/dist/{chunk-YYRQCQPZ.js → chunk-WZY5U6NS.js} +178 -109
- package/dist/{chunk-SZEFU6XC.js → chunk-Y4T6ENKQ.js} +9 -9
- package/dist/{chunk-HMW3VKUF.js → chunk-Z3TMCCZB.js} +10 -10
- package/dist/{ci-workflow-3JNDZQYD.js → ci-workflow-MDSTHJOY.js} +4 -4
- package/dist/{dist-OHDQBTSO.js → dist-72ID44UE.js} +3 -3
- package/dist/{dist-QPWXPCPL.js → dist-R3TOOPJ7.js} +1 -1
- package/dist/{docs-5RYMDHN3.js → docs-2RFOJ6XY.js} +6 -6
- package/dist/{engine-GKGT5ULT.js → engine-BSFKOGPN.js} +4 -4
- package/dist/{entropy-DQTAPSSE.js → entropy-3UX6644G.js} +5 -5
- package/dist/{feedback-WH6XPQJS.js → feedback-CVCFYND4.js} +2 -2
- package/dist/{generate-agent-definitions-SZA4QIHN.js → generate-agent-definitions-HZ3XENWO.js} +5 -5
- package/dist/{glob-helper-XE2UGEOV.js → glob-helper-EX4YZKZO.js} +1 -1
- package/dist/{graph-loader-EQBOIHFZ.js → graph-loader-EIFEOUVI.js} +1 -1
- package/dist/index.d.ts +1012 -12
- package/dist/index.js +27 -27
- package/dist/{loader-BNKGM23C.js → loader-6RHWU5FH.js} +4 -4
- package/dist/{mcp-YKKPWUMH.js → mcp-OYR26JDI.js} +17 -17
- package/dist/{performance-54TMJOEU.js → performance-JJMIRXCH.js} +6 -6
- package/dist/{review-pipeline-OTDDVPNY.js → review-pipeline-BHQZIXWZ.js} +4 -4
- package/dist/{runtime-W5THSNAL.js → runtime-DALTAVTN.js} +4 -4
- package/dist/{scan-4PPP6ZXT.js → scan-LYKLM4EQ.js} +1 -1
- package/dist/{security-27HW7CYT.js → security-RMLMYFPB.js} +1 -1
- package/dist/{validate-QRVCD4GP.js → validate-R7DZRDFK.js} +5 -5
- package/dist/{validate-cross-check-BUAGBAPO.js → validate-cross-check-AUUZFNVL.js} +4 -4
- package/package.json +8 -7
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Harness Design Pipeline
|
|
2
|
+
|
|
3
|
+
> Orchestrator composing all 6 design-pipeline sub-projects into a single sequential pipeline with convergence-based remediation: FRESHEN → DETECT → FIX → AUDIT → FILL → REPORT. Produces a unified `pass` / `warn` / `fail` verdict and a per-phase report. Mirrors harness-docs-pipeline in shape; consumes the formal verifier interface generically so a 5th rule-based verifier composes for free.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When you want a single-command design health check across drift, anatomy, brand, and craft
|
|
8
|
+
- After major UI refactoring that may have caused widespread drift
|
|
9
|
+
- As a periodic hygiene check (per-PR or per-sprint)
|
|
10
|
+
- When onboarding a new project that has no DESIGN.md (bootstrap mode via FILL phase)
|
|
11
|
+
- When `on_pr` triggers fire on a UI-touching change
|
|
12
|
+
- NOT for fixing a single known drift issue (use align-design-system directly)
|
|
13
|
+
- NOT for single-pass verification (use `harness check-design` directly)
|
|
14
|
+
- NOT for authoring DESIGN.md or tokens.json (use `harness-design` skill — orchestrator only stubs absent inputs)
|
|
15
|
+
|
|
16
|
+
## Relationship to Sub-Skills
|
|
17
|
+
|
|
18
|
+
| Skill | Pipeline Phase | Role |
|
|
19
|
+
| ----------------------- | -------------- | ----------------------------------------------------------- |
|
|
20
|
+
| detect-design-drift | DETECT | Find token bypass + primitive-adoption drift |
|
|
21
|
+
| align-design-system | FIX | Apply codemods + emit suggestions for drift findings |
|
|
22
|
+
| audit-component-anatomy | AUDIT | Find missing required anatomy parts in components |
|
|
23
|
+
| audit-brand-compliance | AUDIT | Find token misuse + forbidden phrases (brand semantics) |
|
|
24
|
+
| harness-design-craft | FILL | Critique copy/hierarchy/polish (LLM-judgment ceiling skill) |
|
|
25
|
+
|
|
26
|
+
This orchestrator delegates to sub-skills — it never reimplements their logic. Each sub-skill retains full standalone functionality.
|
|
27
|
+
|
|
28
|
+
## Iron Law
|
|
29
|
+
|
|
30
|
+
**The pipeline delegates, never reimplements.** If you find yourself writing drift detection logic, fix application logic, or audit logic inside the orchestrator, STOP. Delegate to the dedicated sub-skill.
|
|
31
|
+
|
|
32
|
+
**Safe fixes are silent, unsafe fixes surface.** v1 follows align-design-system's pre-flight classifier verdict: `applied` outcomes are silent successes; `suggestion` / `skipped-unsafe` / `failed` outcomes surface in the report. Never override the classifier from inside the orchestrator.
|
|
33
|
+
|
|
34
|
+
## Flags
|
|
35
|
+
|
|
36
|
+
| Flag | Effect |
|
|
37
|
+
| ------------------------- | ----------------------------------------------------------------- |
|
|
38
|
+
| `--fix` | Enable convergence-based auto-fix (default: detect + report only) |
|
|
39
|
+
| `--no-freshen` | Skip the FRESHEN phase |
|
|
40
|
+
| `--no-fill` | Skip the FILL phase (input bootstrap + craft polish) |
|
|
41
|
+
| `--ci` | Non-interactive: safe fixes only, no prompts |
|
|
42
|
+
| `--mode <m>` | Verifier mode (`fast` or `full`); default `fast` |
|
|
43
|
+
| `--files <...>` | Optional file/glob scope passed to each verifier |
|
|
44
|
+
| `--design-strictness <s>` | Override `design.strictness` |
|
|
45
|
+
| `--json` | Machine-readable output |
|
|
46
|
+
|
|
47
|
+
## Shared Context Object
|
|
48
|
+
|
|
49
|
+
All phases read from and write to a shared `DesignPipelineContext`:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
interface DesignPipelineContext {
|
|
53
|
+
graphAvailable: boolean;
|
|
54
|
+
inputs: {
|
|
55
|
+
designMdExists: boolean;
|
|
56
|
+
tokensJsonExists: boolean;
|
|
57
|
+
componentRegistryExists: boolean;
|
|
58
|
+
brandRulesExist: boolean;
|
|
59
|
+
};
|
|
60
|
+
bootstrapped: { designMd; tokensJson; componentRegistry; brandRules: boolean };
|
|
61
|
+
driftFindings: DriftFinding[];
|
|
62
|
+
fixesApplied: FixOutcome[];
|
|
63
|
+
auditFindings: { anatomy: AnatomyFinding[]; brand: BrandFinding[] };
|
|
64
|
+
craftFindings: CraftFinding[];
|
|
65
|
+
craftSuggestions: number;
|
|
66
|
+
exclusions: Set<string>;
|
|
67
|
+
verifiersRun: string[];
|
|
68
|
+
verifiersFailed: Array<{ name: string; error: string }>;
|
|
69
|
+
verdict: 'pass' | 'warn' | 'fail';
|
|
70
|
+
summary: { totalFindings; bySeverity; byCode; fixesApplied; iterationsRun; durationMs };
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The context is passed to sub-skills via `.harness/handoff.json` with a `pipeline` field. align-design-system v1 already supports reading `pipeline.driftFindings` and writing `pipeline.fixesApplied`; other sub-skills run in standalone mode when invoked from the orchestrator.
|
|
75
|
+
|
|
76
|
+
## Process
|
|
77
|
+
|
|
78
|
+
### Phase 1: FRESHEN — Input Freshness Check
|
|
79
|
+
|
|
80
|
+
**Skip this phase if `--no-freshen` flag is set.**
|
|
81
|
+
|
|
82
|
+
1. **Check graph existence.** Look for `.harness/graph/` directory; set `context.graphAvailable`.
|
|
83
|
+
2. **Check input file presence:**
|
|
84
|
+
- `design-system/DESIGN.md` exists?
|
|
85
|
+
- `design-system/tokens.json` exists?
|
|
86
|
+
- `## Component Registry` section present in DESIGN.md?
|
|
87
|
+
- `## Brand Rules` section present in DESIGN.md?
|
|
88
|
+
3. **Set `context.inputs.*` flags.** Bootstrap action is DEFERRED to FILL phase (clean phase responsibilities).
|
|
89
|
+
|
|
90
|
+
### Phase 2: DETECT — Find Design Drift
|
|
91
|
+
|
|
92
|
+
1. Invoke `runDetectDrift({ path, mode, files? })`.
|
|
93
|
+
2. Populate `context.driftFindings` with all `DRIFT-T*` and `DRIFT-P*` findings.
|
|
94
|
+
3. Record `'detect-drift'` in `context.verifiersRun`.
|
|
95
|
+
4. On failure: push to `context.verifiersFailed` and continue (graceful degradation).
|
|
96
|
+
5. If `design.audit.driftDetection.enabled === false` in config: SKIP this phase entirely.
|
|
97
|
+
|
|
98
|
+
### Phase 3: FIX — Convergence-Based Drift Remediation
|
|
99
|
+
|
|
100
|
+
**This phase runs only when `--fix` flag is set.**
|
|
101
|
+
|
|
102
|
+
#### Convergence Loop
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
previousCount = context.driftFindings.length
|
|
106
|
+
maxIterations = 5
|
|
107
|
+
|
|
108
|
+
while iteration < maxIterations:
|
|
109
|
+
1. Write pipeline.driftFindings to handoff.json
|
|
110
|
+
2. Invoke align-design-system in pipeline mode
|
|
111
|
+
3. Append outcomes to context.fixesApplied
|
|
112
|
+
4. If applied === 0: STOP (converged)
|
|
113
|
+
5. Re-run detect-design-drift
|
|
114
|
+
6. newCount = remaining findings
|
|
115
|
+
7. if newCount >= previousCount: STOP (no progress)
|
|
116
|
+
8. previousCount = newCount
|
|
117
|
+
9. iteration++
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Each align run mutates source files via its safe codemods (T001/T002/T003 only). Probably-safe / unsafe / failed outcomes are recorded but never auto-applied (align's pre-flight classifier is the gate).
|
|
121
|
+
|
|
122
|
+
### Phase 4: AUDIT — Rule-Based Verifier Loop
|
|
123
|
+
|
|
124
|
+
1. Iterate the orchestrator's `VerifierRegistry` generically:
|
|
125
|
+
- `audit-anatomy` runner → populate `context.auditFindings.anatomy`
|
|
126
|
+
- `audit-brand` runner → populate `context.auditFindings.brand`
|
|
127
|
+
2. Each verifier's failure is captured in `context.verifiersFailed` without aborting the loop.
|
|
128
|
+
3. **Iron Law:** the orchestrator does NOT branch on verifier name inside the audit logic. Adding a 5th verifier means registering it; the loop body stays unchanged.
|
|
129
|
+
|
|
130
|
+
### Phase 5: FILL — Bootstrap + Ceiling Polish
|
|
131
|
+
|
|
132
|
+
**Skip this phase if `--no-fill` flag is set.**
|
|
133
|
+
|
|
134
|
+
**5a. Bootstrap missing inputs.** For each absent input declared in Phase 1:
|
|
135
|
+
|
|
136
|
+
- DESIGN.md missing → write a minimal stub with `## Aesthetic Direction`, `## Component Registry`, `## Anti-Patterns`, `## Brand Rules` sections, each containing `<!-- TODO: ... -->` placeholders.
|
|
137
|
+
- tokens.json missing → write a minimal `{ "$description": "TODO: declare design tokens" }` stub.
|
|
138
|
+
- `## Component Registry` missing (DESIGN.md exists but section absent) → append a stub table.
|
|
139
|
+
- `## Brand Rules` missing → append a stub voice subsection.
|
|
140
|
+
|
|
141
|
+
Set `context.bootstrapped.{designMd,tokensJson,componentRegistry,brandRules}` per-input.
|
|
142
|
+
|
|
143
|
+
**5b. Invoke design-craft-elevator POLISH (critique phase).**
|
|
144
|
+
|
|
145
|
+
1. Call `runDesignCraft({ phases: ['critique'] })`.
|
|
146
|
+
2. Populate `context.craftFindings` and `context.craftSuggestions`.
|
|
147
|
+
3. Record `'design-craft-critique'` in `context.verifiersRun`.
|
|
148
|
+
|
|
149
|
+
design-craft suggestions are surfaced in REPORT but do NOT contribute to the `error`/`warn` severity counts — they're ceiling-layer suggestions, not violations.
|
|
150
|
+
|
|
151
|
+
### Phase 6: REPORT — Verdict + Summary
|
|
152
|
+
|
|
153
|
+
Compute verdict:
|
|
154
|
+
|
|
155
|
+
| Condition | Verdict |
|
|
156
|
+
| ----------------------------------------------------------------------- | ------- |
|
|
157
|
+
| Any error-severity finding remains after FIX | `fail` |
|
|
158
|
+
| Any warn-severity finding OR craft suggestion OR bootstrapped any input | `warn` |
|
|
159
|
+
| Zero findings, zero suggestions, zero bootstrapped | `pass` |
|
|
160
|
+
|
|
161
|
+
Aggregate `summary.bySeverity` and `summary.byCode` across drift + anatomy + brand findings. (Craft findings use tier, not severity — they're tracked separately.)
|
|
162
|
+
|
|
163
|
+
Render human-readable or JSON output.
|
|
164
|
+
|
|
165
|
+
## Harness Integration
|
|
166
|
+
|
|
167
|
+
- **`harness design-pipeline`** — CLI entry point. Recommended for CI usage with `--ci --fix`.
|
|
168
|
+
- **`mcp__harness__run_design_pipeline`** — MCP tool. Same input/output. Consumed by agents needing the full design health check.
|
|
169
|
+
- **`harness check-design`** — Single-pass verifier. The orchestrator INVOKES check-design's underlying verifiers (anatomy, drift, brand) but expands them into a convergence-loop pipeline. Choose check-design for one-shot verification; choose this orchestrator for the full pipeline with fixes.
|
|
170
|
+
- **`harness validate`** — Stays single-pass (and fast). The orchestrator is opt-in and heavier — different contract.
|
|
171
|
+
- **`.harness/handoff.json`** — Carries the `pipeline` field between orchestrator and align-design-system. Other sub-skills run standalone-mode from the orchestrator's perspective.
|
|
172
|
+
|
|
173
|
+
## Success Criteria
|
|
174
|
+
|
|
175
|
+
See `docs/changes/design-pipeline/orchestrator/proposal.md` for the full 34 success criteria. Highlights:
|
|
176
|
+
|
|
177
|
+
- Generic Verifier registry: adding a 5th verifier requires only a `register()` call
|
|
178
|
+
- Iron Law compliance: orchestrator imports NO drift/fix/audit logic, only sub-skill entry points
|
|
179
|
+
- Convergence loop bounded at 5 iterations + plateau detection
|
|
180
|
+
- Verdict: `pass`/`warn`/`fail` per documented rules
|
|
181
|
+
- 4-platform skill markdown shipped
|
|
182
|
+
- MCP tool `run_design_pipeline` registered (count 73 → 74)
|
|
183
|
+
|
|
184
|
+
## Examples
|
|
185
|
+
|
|
186
|
+
### Example: Clean project, default flags
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
$ harness design-pipeline
|
|
190
|
+
|
|
191
|
+
Verdict: ✓ pass
|
|
192
|
+
|
|
193
|
+
Phases:
|
|
194
|
+
FRESHEN inputs: DESIGN.md=yes tokens.json=yes registry=yes brand=yes
|
|
195
|
+
DETECT drift findings: 0
|
|
196
|
+
FIX iterations: 0, fixes applied: 0
|
|
197
|
+
AUDIT anatomy: 0, brand: 0
|
|
198
|
+
FILL bootstrapped: none, craft suggestions: 0
|
|
199
|
+
|
|
200
|
+
Summary: 0 total findings (0 error, 0 warn, 0 info) in 142ms
|
|
201
|
+
Verifiers run: detect-drift, audit-anatomy, audit-brand, design-craft-critique
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Example: Project with drift, `--fix` enabled
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
$ harness design-pipeline --fix
|
|
208
|
+
|
|
209
|
+
Verdict: ⚠ warn
|
|
210
|
+
|
|
211
|
+
Phases:
|
|
212
|
+
FRESHEN inputs: DESIGN.md=yes tokens.json=yes registry=yes brand=yes
|
|
213
|
+
DETECT drift findings: 14
|
|
214
|
+
FIX iterations: 3, fixes applied: 9
|
|
215
|
+
AUDIT anatomy: 1, brand: 0
|
|
216
|
+
FILL bootstrapped: none, craft suggestions: 4
|
|
217
|
+
|
|
218
|
+
Summary: 5 total findings (0 error, 5 warn, 0 info) in 1842ms
|
|
219
|
+
Verifiers run: detect-drift, align-design-system, audit-anatomy, audit-brand, design-craft-critique
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
(9 drift fixes auto-applied in convergence loop; 5 remaining warnings + 4 craft suggestions for human review)
|
|
223
|
+
|
|
224
|
+
### Example: Empty project, FILL bootstraps inputs
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
$ harness design-pipeline
|
|
228
|
+
|
|
229
|
+
Verdict: ⚠ warn
|
|
230
|
+
|
|
231
|
+
Phases:
|
|
232
|
+
FRESHEN inputs: DESIGN.md=no tokens.json=no registry=no brand=no
|
|
233
|
+
DETECT drift findings: 0
|
|
234
|
+
FIX iterations: 0, fixes applied: 0
|
|
235
|
+
AUDIT anatomy: 0, brand: 0
|
|
236
|
+
FILL bootstrapped: designMd, tokensJson, componentRegistry, brandRules, craft suggestions: 0
|
|
237
|
+
|
|
238
|
+
Summary: 0 total findings (0 error, 0 warn, 0 info) in 89ms
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
(All inputs absent; FILL wrote minimal stubs; verdict `warn` because bootstrap occurred — author the TODO sections to clear it.)
|
|
242
|
+
|
|
243
|
+
## Gates
|
|
244
|
+
|
|
245
|
+
- **No new verifier logic.** Iron Law. Delegate to sub-skills exclusively.
|
|
246
|
+
- **No graph schema changes.** Findings persist through the existing `DesignConstraintAdapter.recordFindings()` path.
|
|
247
|
+
- **No interactive prompts in v1.** `--fix` applies safe codemods silently; probably-safe / unsafe surface as suggestions only. `--ci` is the default behavior in v1; v1.x adds `--interactive` for terminal sessions.
|
|
248
|
+
- **No standalone `harness validate` invocation.** validate stays single-pass; the orchestrator is opt-in.
|
|
249
|
+
- **No DESIGN.md content generation.** Bootstrap writes stubs with TODO comments — sample content rots faster than skeletons.
|
|
250
|
+
|
|
251
|
+
## Escalation
|
|
252
|
+
|
|
253
|
+
- **When the convergence loop hits maxIterations without converging:** check `context.summary.iterationsRun === 5`. Real fix oscillation almost always indicates a conflict between drift findings (e.g., two tokens with the same value). Inspect `fixesApplied` outcomes; the failing pattern is usually visible.
|
|
254
|
+
- **When a verifier consistently fails:** `context.verifiersFailed[].error` carries the message. Run the verifier standalone (e.g. `harness skill run audit-brand-compliance`) to reproduce — orchestrator just propagates the failure.
|
|
255
|
+
- **When FILL bootstraps a file you didn't want bootstrapped:** delete the stub; the orchestrator only writes when the file is absent. Or run with `--no-fill` to suppress the entire phase.
|
|
256
|
+
- **When verdict is `fail` but you want to merge anyway:** the orchestrator exits with code 1; bypass via CI config (treating design-pipeline as advisory not blocking). Not recommended — error-severity findings represent declared violations.
|
|
257
|
+
- **When `--ci` mode is too conservative:** v1's `--ci` only applies align's `safe-codemod`-classified fixes. Use v1.x's `--interactive` (or the standalone `harness align-design-system --dry-run`) to review and apply probably-safe fixes manually.
|
|
258
|
+
|
|
259
|
+
## Status
|
|
260
|
+
|
|
261
|
+
**v1 — in implementation.** See:
|
|
262
|
+
|
|
263
|
+
- Spec: `docs/changes/design-pipeline/orchestrator/proposal.md`
|
|
264
|
+
- Roadmap entry: `design-pipeline sub-project #5` (the orchestrator)
|
|
265
|
+
- Sibling: `harness-docs-pipeline` (the pattern this mirrors)
|
|
266
|
+
- Floor + ceiling sub-skills: `detect-design-drift` (#1), `align-design-system` (#1), `audit-component-anatomy` (#2), `audit-brand-compliance` (#3), `check-design` (#4), `harness-design-craft` (#6)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: harness-design-pipeline
|
|
2
|
+
version: "0.1.0"
|
|
3
|
+
description: Orchestrator composing detect-design-drift, align-design-system, audit-component-anatomy, audit-brand-compliance, and design-craft-elevator into a sequential pipeline with convergence-based remediation. Mirrors harness-docs-pipeline. Consumes the formal verifier interface generically.
|
|
4
|
+
stability: draft
|
|
5
|
+
cognitive_mode: constructive-architect
|
|
6
|
+
triggers:
|
|
7
|
+
- manual
|
|
8
|
+
- on_pr
|
|
9
|
+
- on_new_feature
|
|
10
|
+
platforms:
|
|
11
|
+
- claude-code
|
|
12
|
+
tools:
|
|
13
|
+
- Bash
|
|
14
|
+
- Read
|
|
15
|
+
- Write
|
|
16
|
+
- Edit
|
|
17
|
+
- Glob
|
|
18
|
+
- Grep
|
|
19
|
+
cli:
|
|
20
|
+
command: harness design-pipeline
|
|
21
|
+
args:
|
|
22
|
+
- name: path
|
|
23
|
+
description: Project root path
|
|
24
|
+
required: false
|
|
25
|
+
- name: fix
|
|
26
|
+
description: Enable convergence-based remediation
|
|
27
|
+
required: false
|
|
28
|
+
- name: no-freshen
|
|
29
|
+
description: Skip the FRESHEN phase
|
|
30
|
+
required: false
|
|
31
|
+
- name: no-fill
|
|
32
|
+
description: Skip the FILL phase
|
|
33
|
+
required: false
|
|
34
|
+
- name: ci
|
|
35
|
+
description: Non-interactive (safe fixes only)
|
|
36
|
+
required: false
|
|
37
|
+
mcp:
|
|
38
|
+
tool: run_design_pipeline
|
|
39
|
+
input:
|
|
40
|
+
path: string
|
|
41
|
+
fix: boolean
|
|
42
|
+
type: rigid
|
|
43
|
+
tier: 2
|
|
44
|
+
phases:
|
|
45
|
+
- name: freshen
|
|
46
|
+
description: Check input freshness (DESIGN.md, tokens.json, graph staleness)
|
|
47
|
+
required: false
|
|
48
|
+
- name: detect
|
|
49
|
+
description: Invoke detect-design-drift; collect DRIFT-* findings
|
|
50
|
+
required: true
|
|
51
|
+
- name: fix
|
|
52
|
+
description: Convergence loop with align-design-system (only when --fix is set)
|
|
53
|
+
required: false
|
|
54
|
+
- name: audit
|
|
55
|
+
description: Generic Verifier<F> registry loop (audit-anatomy + audit-brand)
|
|
56
|
+
required: true
|
|
57
|
+
- name: fill
|
|
58
|
+
description: Bootstrap missing inputs + invoke design-craft POLISH
|
|
59
|
+
required: false
|
|
60
|
+
- name: report
|
|
61
|
+
description: Compute verdict + summary
|
|
62
|
+
required: true
|
|
63
|
+
state:
|
|
64
|
+
persistent: false
|
|
65
|
+
depends_on:
|
|
66
|
+
- detect-design-drift
|
|
67
|
+
- align-design-system
|
|
68
|
+
- audit-component-anatomy
|
|
69
|
+
- audit-brand-compliance
|
|
70
|
+
- harness-design-craft
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Knowledge Craft
|
|
2
|
+
|
|
3
|
+
> LLM-judgment critique of knowledge-entry quality. Critiques `docs/knowledge/` entries (EXCLUDING `decisions/` — that's spec-craft's territory) against a curated rubric catalog: does this state a load-bearing FACT or paraphrase the code? Would deleting it lose specific signal? Does it earn its place in the knowledge graph as `business_fact` / `business_rule` / `business_concept` / `business_decision`? Fifth non-design member of the craft-pipeline initiative (#9 of 10). Emits 3-axis findings (tier × impact × confidence per ADR 0019).
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- During PR review on a new or substantially-rewritten knowledge entry
|
|
8
|
+
- After authoring a knowledge entry, before adding it to the index
|
|
9
|
+
- When onboarding a new contributor (audit entries they introduced)
|
|
10
|
+
- Periodically (per-sprint or per-release) to catch knowledge-entry rot
|
|
11
|
+
- As a quality gate before `harness-knowledge-pipeline` ingests an entry into the graph
|
|
12
|
+
- NOT for ADR / proposal critique (use `spec-craft` — `decisions/` is its territory)
|
|
13
|
+
- NOT for AGENTS.md critique (different shape: navigational manifest, not fact-bearing entry — v1.x)
|
|
14
|
+
- NOT for autofix / knowledge-entry rewriting (this is judgment-only; v1.x may add `align-knowledge` sibling)
|
|
15
|
+
- NOT for graph-membership checks (no graph reads at runtime — references the taxonomy in rubric prompts)
|
|
16
|
+
- NOT for source-code comment critique (use `code-craft` #4 or `docs-craft` #2)
|
|
17
|
+
|
|
18
|
+
## Process
|
|
19
|
+
|
|
20
|
+
### Phase 1: DISCOVER — Find knowledge entries
|
|
21
|
+
|
|
22
|
+
1. **Read project configuration.** Check `harness.config.json` for:
|
|
23
|
+
- `craft.knowledge.enabled` — gate (default `true`)
|
|
24
|
+
- `craft.knowledge.maxFiles` — entry count cap (default 50)
|
|
25
|
+
- `craft.knowledge.excludeDirs` — extra subdirs to skip
|
|
26
|
+
|
|
27
|
+
2. **Walk `docs/knowledge/` recursively:**
|
|
28
|
+
- Include `*.md` files (case-insensitive `README.md` excluded)
|
|
29
|
+
- EXCLUDE `decisions/` subdir entirely (spec-craft's territory)
|
|
30
|
+
- EXCLUDE any user-supplied extra dirs via `--exclude-dirs`
|
|
31
|
+
- Caller-supplied `--files` overrides discovery for explicit scoping
|
|
32
|
+
|
|
33
|
+
### Phase 2: CRITIQUE — Per (file, rubric) loop
|
|
34
|
+
|
|
35
|
+
7 seed rubrics:
|
|
36
|
+
|
|
37
|
+
| Rubric | Title |
|
|
38
|
+
| ----------- | ----------------------------------------------- |
|
|
39
|
+
| `KNOW-R001` | States a load-bearing fact (not paraphrase) |
|
|
40
|
+
| `KNOW-R002` | Truth a code reader could not derive |
|
|
41
|
+
| `KNOW-R003` | Earns a place in the knowledge graph taxonomy |
|
|
42
|
+
| `KNOW-R004` | Carries forward a decision that would erode |
|
|
43
|
+
| `KNOW-R005` | Deleting would lose specific knowledge |
|
|
44
|
+
| `KNOW-R006` | Concrete and operationally defined |
|
|
45
|
+
| `KNOW-R007` | A stranger could pick it up six months from now |
|
|
46
|
+
|
|
47
|
+
For each (file, rubric) pair:
|
|
48
|
+
|
|
49
|
+
1. Build prompt with rubric description + file path + relative-to-knowledge-root path + entry contents (truncated to 4000 chars for cost).
|
|
50
|
+
2. LLM returns fenced JSON: `null` (rubric doesn't apply / entry is fine) OR `{ tier, impact, confidence, message }`.
|
|
51
|
+
3. On non-null: emit a `KnowledgeFinding` with `cite.rubricId` populated for ADR 0020 traceability.
|
|
52
|
+
|
|
53
|
+
`KNOW-R003` is the rubric that references the graph taxonomy (`business_fact`, `business_rule`, `business_concept`, `business_decision`) inside its description — the LLM critiques against the taxonomy without knowledge-craft ever reading the graph.
|
|
54
|
+
|
|
55
|
+
### Phase 3: REPORT — Aggregate + cost telemetry
|
|
56
|
+
|
|
57
|
+
Emit `KnowledgeCraftOutput`:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
{
|
|
61
|
+
findings: KnowledgeFinding[];
|
|
62
|
+
summary: {
|
|
63
|
+
phaseRun: ['critique'];
|
|
64
|
+
mode: 'fast';
|
|
65
|
+
durationMs: number;
|
|
66
|
+
llmCalls: { provider, model, count, costUsd };
|
|
67
|
+
catalog: { rubricsApplied: string[] };
|
|
68
|
+
counts: { filesScanned, filesSkipped };
|
|
69
|
+
runId: string;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Harness Integration
|
|
75
|
+
|
|
76
|
+
- **`harness knowledge-craft`** — CLI entry. `--files <glob>` / `--exclude-dirs <dirs...>` / `--max-files <n>` / `--json` / `--verbose`.
|
|
77
|
+
- **`mcp__harness__knowledge_craft`** — MCP tool. Same input/output. Consumed by agents.
|
|
78
|
+
- **Cross-cutting API:** `critiqueKnowledgeFile(file, opts)` exported from `packages/cli/src/knowledge-craft/index.ts`. Future craft skills (or `harness-knowledge-pipeline`) can call this on a single entry without re-walking the project.
|
|
79
|
+
- **Shared craft infrastructure:** `LlmProvider`, `MockLlmProvider`, `derivePriority`, 3-axis types all live in `packages/cli/src/shared/craft/`.
|
|
80
|
+
|
|
81
|
+
## Success Criteria
|
|
82
|
+
|
|
83
|
+
See `docs/changes/craft-pipeline/knowledge-craft/proposal.md` for the full 25 success criteria. Highlights:
|
|
84
|
+
|
|
85
|
+
- 7 seed rubrics ship at `catalog/rubrics/<id>.ts` (file-per-rubric)
|
|
86
|
+
- 3-axis output preserved (tier × impact × confidence, never collapsed)
|
|
87
|
+
- `cite.rubricId` populated on every finding (ADR 0020)
|
|
88
|
+
- `decisions/` subdir is hard-excluded from discovery (spec-craft territory)
|
|
89
|
+
- `KNOW-R003` references graph node types in rubric prompt without graph imports at runtime
|
|
90
|
+
- `critiqueKnowledgeFile` cross-cutting API works on a single file without project walk
|
|
91
|
+
|
|
92
|
+
## Examples
|
|
93
|
+
|
|
94
|
+
### Example: Paraphrase entry
|
|
95
|
+
|
|
96
|
+
**Input:** `docs/knowledge/auth/email-validator.md`:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
# Email Validator
|
|
100
|
+
|
|
101
|
+
The user service validates emails via the EmailValidator class, which
|
|
102
|
+
applies the standard regex pattern and rejects malformed addresses.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Output (mock LLM):**
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
KNOW-R001 [foundational/large/medium] auth/email-validator.md
|
|
109
|
+
This entry restates what a reader would learn from opening
|
|
110
|
+
EmailValidator.ts. It states no load-bearing fact about the domain:
|
|
111
|
+
no upstream constraint, no historical reason for the choice, no business
|
|
112
|
+
rule that necessitated validation. Either rewrite to capture the WHY
|
|
113
|
+
(e.g., "emails must round-trip through Postmark within 30s for
|
|
114
|
+
deliverability tracking") or delete — the code already speaks.
|
|
115
|
+
KNOW-R005 [polish/medium/medium] auth/email-validator.md
|
|
116
|
+
Deleting this entry would lose nothing the code doesn't already convey.
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Example: Decision-bearing entry
|
|
120
|
+
|
|
121
|
+
**Input:** `docs/knowledge/storage/postgres-over-dynamo.md`:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
# Why Postgres over DynamoDB
|
|
125
|
+
|
|
126
|
+
We chose Postgres over DynamoDB because our access patterns are
|
|
127
|
+
relational (frequent multi-table joins on tenant + user) and our team's
|
|
128
|
+
ops muscle is in SQL. DynamoDB's single-table design was rejected
|
|
129
|
+
because the modeling overhead of GSIs outweighs the latency win for
|
|
130
|
+
our request profile.
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Output:**
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
(no findings)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
This entry carries forward a decision with the alternative AND the reason — KNOW-R004 passes, KNOW-R001 passes (load-bearing fact: the rejected option + the WHY), KNOW-R005 passes (deleting loses knowledge a reader couldn't reconstruct from the schema alone).
|
|
140
|
+
|
|
141
|
+
### Example: Empty project — no knowledge entries
|
|
142
|
+
|
|
143
|
+
**Input:** Project has no `docs/knowledge/` directory.
|
|
144
|
+
|
|
145
|
+
**Output:**
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
No knowledge-entry findings.
|
|
149
|
+
|
|
150
|
+
Summary: 0 findings across 0 entries (0 skipped, 7 rubrics, 0 LLM calls, $0.0000, 2ms)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Gates
|
|
154
|
+
|
|
155
|
+
- **No autofix.** Sibling `align-knowledge` deferred until signal warrants safe-to-apply rewrites.
|
|
156
|
+
- **No ADR critique.** `decisions/` is spec-craft's territory; double-critique on the same files produces noise.
|
|
157
|
+
- **No AGENTS.md critique.** Navigational manifests need a different rubric vocabulary; v1.x.
|
|
158
|
+
- **No graph reads.** v1 references graph node types in rubric prompts so the LLM critiques against the taxonomy without a runtime graph dependency.
|
|
159
|
+
- **No graph persistence of findings.** Phase 1 MVP.
|
|
160
|
+
- **No per-section / per-claim mode.** v1 is per-file (knowledge entries are typically focused single-topic).
|
|
161
|
+
- **No `.mdx` support.** Different parsing concerns; v1.x.
|
|
162
|
+
- **No B' bootstrap.** Same posture as the rest of the craft family.
|
|
163
|
+
|
|
164
|
+
## Escalation
|
|
165
|
+
|
|
166
|
+
- **When LLM cost is too high:** drop `maxFiles` to 25, or scope explicitly with `--files`. Per-entry cost = rubrics × per-call; truncation already caps per-call cost at 4000 input chars.
|
|
167
|
+
- **When a rubric produces high false-positive rate:** v1 has no per-rubric disable; v1.x adds `craft.knowledge.disabledRubrics: ['KNOW-R007']`. Until then: filter findings by `cite.rubricId` in your consumer.
|
|
168
|
+
- **When an entry is intentionally scratchpad / in-progress:** low-confidence findings are de-emphasized per ADR 0019. v1.x adds per-entry opt-out via `<!-- knowledge-craft:skip -->` HTML comment.
|
|
169
|
+
- **When you want graph-aware critique (e.g., "this entry duplicates an existing business_fact node"):** v1.x opt-in mode will read the graph; v1 stays read-free.
|
|
170
|
+
- **When you want to critique an ADR:** use `harness spec-craft` — ADRs are its territory. Knowledge-craft will refuse to walk `decisions/`.
|
|
171
|
+
|
|
172
|
+
## Status
|
|
173
|
+
|
|
174
|
+
**v1 — in implementation.** See:
|
|
175
|
+
|
|
176
|
+
- Spec: `docs/changes/craft-pipeline/knowledge-craft/proposal.md`
|
|
177
|
+
- Roadmap entry: `craft-pipeline sub-project #9`
|
|
178
|
+
- Sibling craft skills: `naming-craft` (#1), `spec-craft` (#6), `copy-craft` (#5), `test-craft` (#3), `harness-design-craft` (design-pipeline #6)
|
|
179
|
+
- Shared infrastructure: `packages/cli/src/shared/craft/`
|
|
180
|
+
- Future: `align-knowledge` (FIX side), AGENTS.md / `.mdx` support, graph-aware mode, composition with `harness-knowledge-pipeline` at ingest time.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: knowledge-craft
|
|
2
|
+
version: "0.1.0"
|
|
3
|
+
description: LLM-judgment critique of knowledge-entry quality (docs/knowledge/, excluding decisions/ which is spec-craft territory). Per-file critique against 7 seed rubrics that ask whether the entry states a load-bearing fact, earns a place in the graph taxonomy, carries forward a decision that would otherwise erode. Fifth non-design craft-pipeline ceiling skill.
|
|
4
|
+
stability: draft
|
|
5
|
+
cognitive_mode: constructive-architect
|
|
6
|
+
triggers:
|
|
7
|
+
- manual
|
|
8
|
+
- on_pr
|
|
9
|
+
- on_new_feature
|
|
10
|
+
platforms:
|
|
11
|
+
- claude-code
|
|
12
|
+
tools:
|
|
13
|
+
- Bash
|
|
14
|
+
- Read
|
|
15
|
+
- Glob
|
|
16
|
+
- Grep
|
|
17
|
+
cli:
|
|
18
|
+
command: harness knowledge-craft
|
|
19
|
+
args:
|
|
20
|
+
- name: path
|
|
21
|
+
description: Project root path
|
|
22
|
+
required: false
|
|
23
|
+
- name: files
|
|
24
|
+
description: Optional file scope (overrides discovery)
|
|
25
|
+
required: false
|
|
26
|
+
- name: exclude-dirs
|
|
27
|
+
description: Extra subdir names to skip under docs/knowledge/ (decisions is always excluded)
|
|
28
|
+
required: false
|
|
29
|
+
mcp:
|
|
30
|
+
tool: knowledge_craft
|
|
31
|
+
input:
|
|
32
|
+
path: string
|
|
33
|
+
type: rigid
|
|
34
|
+
tier: 2
|
|
35
|
+
phases:
|
|
36
|
+
- name: discover
|
|
37
|
+
description: Walk docs/knowledge/ recursively, exclude decisions/ + user-supplied dirs
|
|
38
|
+
required: true
|
|
39
|
+
- name: critique
|
|
40
|
+
description: LLM-rubric loop per (file, rubric) — 7 seed rubrics
|
|
41
|
+
required: true
|
|
42
|
+
- name: report
|
|
43
|
+
description: Aggregate findings + cost telemetry + entry counts
|
|
44
|
+
required: true
|
|
45
|
+
state:
|
|
46
|
+
persistent: false
|
|
47
|
+
depends_on:
|
|
48
|
+
- harness-soundness-review
|
|
49
|
+
- spec-craft
|